我有一个这样的收集类:

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/

10-17 02:44