c#从基类隐式转换

Joh*_*ona 8 c# .net-4.0 implicit-conversion

我有一个这样的集合类:

public class SomeDataCollection : List<ISomeData>
{
    // some method ...
}
Run Code Online (Sandbox Code Playgroud)

但我不能这样做:

SomeDataCollection someDatas = new List<ISomeData>();
Run Code Online (Sandbox Code Playgroud)

无法隐式转换List<ISomeData>SomeDataCollection.存在显式转换(您是否错过了演员?)

所以我尝试在SomeDataCollection集合类中创建一个隐式的转换器:

public static implicit operator SomeDataCollection(List<ISomeData> l)
{
    var someDatas = new SomeDataCollection();
    someDatas.AddRange(l);
    return someDatas;
}
Run Code Online (Sandbox Code Playgroud)

但它说我不能创建这样的转换器:

SomeDataCollection.implicit operator SomeDataCollection(List<ISomeData>):不允许在基类之间进行用户定义的转换

当我这样投出时:

SomeDataCollection someDatas = (SomeDataCollection)new List<ISomeData>();
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误,说:

System.InvalidCastException:无法将类型的对象强制转换List<ISomeData>为类型SomeDataCollection.

我怎样才能做到这一点:

SomeDataCollection someDatas = new List<ISomeData>();
Run Code Online (Sandbox Code Playgroud)

没有收到错误?请帮忙.提前致谢.

Mar*_*ell 6

A new List<ISomeData>();仍然只是一个List<ISomeData>.它不是SomeDataCollection.子类化的要点是子类可以有额外的状态等,但是一个对象(一旦创建)永远不会改变类型.

不允许在同一层次结构中的类型之间创建运算符,因为这会破坏通常和预期的转换行为.

您可以简单地使用:

var data = new SomeDataCollection();
Run Code Online (Sandbox Code Playgroud)

但是我应该坦率地说,它对子类很少有用List<T>.尤其是,它不会暴露任何有用的virtual方法,因此您无法调整行为.我会诚实地使用List<ISomeData>(并SomeDataCollection完全删除),除非我有明确和可证明的目的.然后:我可以封装列表,也可以继承Collection<T>.

您可以随时将该方法添加为扩展方法吗?

public static class Utils {
    public static void SomeMethod(this IList<ISomeData> list) {
      ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

var list = new List<ISomeData>();
...
list.SomeMethod();
Run Code Online (Sandbox Code Playgroud)