繁体   English   中英

c#从基类隐式转换

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM