C# - 为什么我不能将List <MyObject>强制转换为继承自List <MyObject>的类?

djd*_*d87 0 inheritance compact-framework class list c#-2.0

我有一个对象,我称之为MyObject.它是一个控制特定数据行的类.

然后我得到了一个名为MyObjectCollection的集合类:

public class MyObjectCollection : List<MyObject> {}
Run Code Online (Sandbox Code Playgroud)

为什么我不能做以下事情:

List<MyObject> list = this.DoSomethingHere();
MyObjectCollection collection = (MyObjectCollection)list;
Run Code Online (Sandbox Code Playgroud)

提前致谢.

编辑:错误是InvalidCastException

Jon*_*eet 5

我的猜测是DoSomethingHere不会返回一个实例MyObjectCollection.

让我们在这里摆脱所有的泛型等,因为它们不相关.这是我怀疑你想要做的事情:

public static object CreateAnObject()
{
    return new object();
}

object o = CreateAnObject();
string s = (string) o;
Run Code Online (Sandbox Code Playgroud)

这将失败(在执行时)并且非常正确.

要将其恢复到您的代码中,除非在执行时DoSomethingHere 实际返回,否则MyObjectCollection强制转换将失败.


Den*_*ler 5

因为a List<MyObject>不是MyObjectCollection.相反的是真实的:你可以施放MyObjectCollection的名单,因为MyObjectCollection从继承List<MyObject>,因此,对于所有意图和目的,是一种List<MyObject>.

你唯一能做的就是在MyObjectCollection上定义一个构造函数,它将一个Ienumerable作为一个参数,并用另一个中的数据初始化,但这会产生一个包含相同数据的新对象:

public class MyObjectCollection : List<MyObject> 
{
  public MyObjectCollection(IEnumerable<MyObject> items)
  {
    Addrange(items); 
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:如注释中所述,只要DoSomething实际返回MyObjectCollection的实例,您就可以在运行时成功执行转换.如果是这样,该对象实际上是一个MyObjectCollection,并且强制转换是完全合法的.

我不得不说,在我看来这是不好的做法.如果函数返回List,则不应该依赖于List的特定实现.如果您拥有该函数,则修改DoSomething的返回类型,并返回MyObjectCollection,或者将其作为列表处理.