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)
没有收到错误?请帮忙.提前致谢.
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)
| 归档时间: |
|
| 查看次数: |
5042 次 |
| 最近记录: |