使用元组作为通用接口的显式接口实现不起作用
Explicit interface implementation with tuple as interface generic not working
情况:
我正在尝试实现一个为项目分配权重的专门集合。
我无法使用 List<(T, double)>
,因为该集合需要跟踪更多信息以提供特殊功能。
但是,这个集合应该实现 IList<(T, double)>
,这样我就可以使用一些扩展方法。
方法:
实现接口有效:
public class WeightedList<T> : IList<(T item, double weight)>
{
public void Add((T item, double weight) item)
{
this.Add(item.item, item.weight);
}
[...]
}
但是,为了保持实现的简洁,我想明确地实现它的一些方法。
public class WeightedList<T> : IList<(T item, double weight)>
{
// The method name Add is marked as source of error
void IList<(T item, double weight)>.Add((T item, double weight) item)
{
this.Add(item.item, item.weight);
}
[...]
}
问题:
但是现在突然报错,好像显式接口实现不识别了
Error CS0535 : 'WeightedList' does not implement interface member 'ICollection<(T item, double weight)>.Add((T item, double weight))'
Error CS0539 : 'WeightedList.Add((T item, double weight))' in explicit interface declaration is not found among members of the interface that can be implemented
我所做的唯一更改是将方法更改为显式实现。
到目前为止,这对我来说非常有用,但是使用元组作为通用接口似乎会破坏它。
我还为接口尝试了未命名的元组(例如 IList<(T, double)>
),但这并没有改变任何东西。
问题:
为什么会出现这些错误以及如何修复它们?
在显式接口实现中,声明正确的接口很重要:
public class WeightedList<T> : IList<(T item, double weight)>
{
// The method name Add is marked as source of error
void ICollection<(T item, double weight)>.Add((T item, double weight) item)
{
this.Add(item.item, item.weight);
}
[...]
}
IList<T>
派生自 ICollection<T>
。 Add
方法是在基接口而不是派生接口中声明的。
情况:
我正在尝试实现一个为项目分配权重的专门集合。
我无法使用 List<(T, double)>
,因为该集合需要跟踪更多信息以提供特殊功能。
但是,这个集合应该实现 IList<(T, double)>
,这样我就可以使用一些扩展方法。
方法:
实现接口有效:
public class WeightedList<T> : IList<(T item, double weight)>
{
public void Add((T item, double weight) item)
{
this.Add(item.item, item.weight);
}
[...]
}
但是,为了保持实现的简洁,我想明确地实现它的一些方法。
public class WeightedList<T> : IList<(T item, double weight)>
{
// The method name Add is marked as source of error
void IList<(T item, double weight)>.Add((T item, double weight) item)
{
this.Add(item.item, item.weight);
}
[...]
}
问题:
但是现在突然报错,好像显式接口实现不识别了
Error CS0535 : 'WeightedList' does not implement interface member 'ICollection<(T item, double weight)>.Add((T item, double weight))'
Error CS0539 : 'WeightedList.Add((T item, double weight))' in explicit interface declaration is not found among members of the interface that can be implemented
我所做的唯一更改是将方法更改为显式实现。
到目前为止,这对我来说非常有用,但是使用元组作为通用接口似乎会破坏它。
我还为接口尝试了未命名的元组(例如 IList<(T, double)>
),但这并没有改变任何东西。
问题:
为什么会出现这些错误以及如何修复它们?
在显式接口实现中,声明正确的接口很重要:
public class WeightedList<T> : IList<(T item, double weight)>
{
// The method name Add is marked as source of error
void ICollection<(T item, double weight)>.Add((T item, double weight) item)
{
this.Add(item.item, item.weight);
}
[...]
}
IList<T>
派生自 ICollection<T>
。 Add
方法是在基接口而不是派生接口中声明的。