如何检查 IEnumerable<T1>
是否协变于 IEnumerable<T2>
的通用规则是什么?
我进行了一些实验:
1.
Object Obj = "Test string";
IEnumerable<Object> Objs = new String[100];
这段代码之所以能够运行,是因为IEnumerable<out T>
是协变的,而String
继承自Object
。
2.
interface MyInterface{}
struct MyStruct:MyInterface{}
.....
Object V = new MyStruct();
Console.WriteLine(new MyStruct() is Object); // Output: True.
IEnumerable<Object> Vs = new MyStruct[100]; // Compilation error here
MyStruct
实际上是一个 Object
,但它不能正常工作,因为 Object
是引用类型而 MyStruct
是值类型。好的,我在这里看到了一些逻辑。
3.
Console.WriteLine(new MyStruct() is ValueType); // Output: "True"
ValueType V2 = new MyStruct();
IEnumerable<ValueType> Vs2 = new MyStruct[100]; // Compilation error here
应该可以工作,因为
IEnumerable<out T>
是协变的,而MyStruct
是ValueType
,但实际上并不能工作...好吧,也许MyStruct
并没有继承ValueType
....MyInterface V3 = new MyStruct();
Console.WriteLine(V3 is MyInterface); // Output: "True"
IEnumerable<MyInterface> Vs3 = new MyStruct[100]; // Compilation error here
即便是这种情况:"无法将 MyStruct 转换为 MyInterface",真的吗??你刚刚在前一行就做到了...
我试图总结出通用规则:
public static bool IsCovariantIEnumerable(Type T1, Type T2 ){
return (T2.IsAssignableFrom(T1)) && !T2.IsValueType; // Is this correct??
}
那么问题是如何实际确定
IEnumerable<T1>
是否协变于 IEnumerable<T2>
?我的 IsCovariantIEnumerable(...)
函数是否正确?如果是,是否有更简单的方法来检查它?如果不是,应该如何修复?另请参考这些文章:1、2。
object
,则需要对其进行装箱 - 例如array.Cast<IMyInterface>
。鉴于您提供的链接已经回答了这个问题,因此不清楚您不理解其中的哪一部分 :) - LuaanIEnumerable<T1>
是否协变到IEnumerable<T2>
。我仍然不确定我的IsCovariantIEnumerable()
函数是否正确。 - AstronavigatorIsAssignableFrom
可能比IsSubclassOf
更好。 - grek40MyStruct
是一个struct
。如果它是一个class
,它就可以正常工作,因此与第一个示例一致。 - fknxMyStruct
实现了MyInterface
。这就是为什么我尝试过它的原因。 - Astronavigator