我有一个这样的收集类:
public class SomeDataCollection : List<ISomeData>
{
// some method ...
}
但我不能这样做:
SomeDataCollection someDatas = new List<ISomeData>();
所以我尝试在
SomeDataCollection
集合类中创建一个隐式掩体:public static implicit operator SomeDataCollection(List<ISomeData> l)
{
var someDatas = new SomeDataCollection();
someDatas.AddRange(l);
return someDatas;
}
但是它说我不能创建这样的转换器:
当我像这样转换它时:
SomeDataCollection someDatas = (SomeDataCollection)new List<ISomeData>();
它抛出一个错误,说:
我怎样才能做到这一点:
SomeDataCollection someDatas = new List<ISomeData>();
没有出现错误?请帮忙。提前致谢。
最佳答案
new List<ISomeData>();
仍然只是List<ISomeData>
。这不是SomeDataCollection
。子类化的要点是子类可能具有额外的状态等,但是对象(一旦创建)永不更改类型。
不允许在同一层次结构中的类型之间创建运算符,因为这会破坏通常的和预期的转换行为。
您可以简单地使用:
var data = new SomeDataCollection();
但是我应该坦白地说,将
List<T>
子类化几乎是没有用的。尤其重要的是,它没有公开任何有用的virtual
方法,因此您无法调整行为。老实说,除非我有明确和可证明的用途,否则我只会使用List<ISomeData>
(并完全删除SomeDataCollection
)。然后:我可以封装列表,或者从Collection<T>
继承。您总是可以只将方法添加为扩展方法吗?
public static class Utils {
public static void SomeMethod(this IList<ISomeData> list) {
...
}
}
然后:
var list = new List<ISomeData>();
...
list.SomeMethod();
关于从基类的C#隐式转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11221500/