[英]c# implicit conversion from base class
我有一个这样的集合类:
public class SomeDataCollection : List<ISomeData>
{
// some method ...
}
但我不能这样做:
SomeDataCollection someDatas = new List<ISomeData>();
无法将类型
List<ISomeData>
隐式转换为SomeDataCollection
。 存在显式转换(您是否错过了演员?)
所以我尝试在SomeDataCollection
集合类中创建一个隐式转换器:
public static implicit operator SomeDataCollection(List<ISomeData> l)
{
var someDatas = new SomeDataCollection();
someDatas.AddRange(l);
return someDatas;
}
但它说我不能创建这样的转换器:
SomeDataCollection.implicit operator SomeDataCollection(List<ISomeData>)
: 不允许在基类之间进行用户定义的转换
当我这样投出时:
SomeDataCollection someDatas = (SomeDataCollection)new List<ISomeData>();
它抛出一个错误,说:
System.InvalidCastException:无法转换
List<ISomeData>
类型的对象以键入SomeDataCollection
。
我怎样才能做到这一点:
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();
首先,为什么要将new List<ISomeData>
写入定义为SomeDataCollection
的变量? 你有可能真的想要SomeDataCollection someDatas = new SomeDataCollection();
对于错误消息,第一条错误消息告诉您List<ISomeData>
不是从SomeDataCollection
派生的,因此您无法使用SomeDataCollection
执行SomeDataCollection
,因此您无法将其写入已定义的变量作为SomeDataCollection
(想象一下,如果SomeDataCollection
在其中有public void someMethod()
,稍后在代码中你将调用someDatas.someMethod()
)。
第二条错误消息告诉您转换器用于在完全不同的类型之间进行转换,而不是在基于类型和派生类型之间进行转换。 否则,您希望获得什么,例如在以下示例中:
SomeDataCollection a = new SomeDataCollection();
List<ISomeData> b = (List<ISomeData>)a;
SomeDataCollection c = (SomeDataCollection)b;
它应该叫你的转换器吗?
基本上你要编写的代码是非常错误的,所以我们需要知道你想要做什么,然后很可能能够告诉你你的根问题的解决方案(而不是问题的解决方案) “如何编译此代码”)。
在SomeDataCollection
实现构造函数不是更好吗?
public SomeDataCollection() : base() { }
这当然可以补充
public SomeDataCollection(IEnumerable<ISomeData> collection)
: base(collection) { }
然后你应该能够像这样初始化你的SomeDataCollection
:
SomeDataCollection someData = new SomeDataCollection();
SomeDataCollection someOtherData =
new SomeDataCollection(collectionOfSomeData);
并且仍然可以访问List<ISomeData>
所有公共方法和属性。
它与泛型没有问题。 在C#中,不允许将基类明确地转换为派生类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.