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
我的猜测是DoSomethingHere不会返回一个实例MyObjectCollection.
让我们在这里摆脱所有的泛型等,因为它们不相关.这是我怀疑你想要做的事情:
public static object CreateAnObject()
{
return new object();
}
object o = CreateAnObject();
string s = (string) o;
Run Code Online (Sandbox Code Playgroud)
这将失败(在执行时)并且非常正确.
要将其恢复到您的代码中,除非在执行时DoSomethingHere 实际返回,否则MyObjectCollection强制转换将失败.
因为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,或者将其作为列表处理.