基本上,这相当于什么,但100%保证可以工作?
object x = new List<MyTypeWhichImplementsIInterface>();
bool shouldBeTrue = x is IEnumerable<IInterface>;
从一些粗略的测试看起来似乎有效,但我不确定。
答案 0 :(得分:6)
这适用于C#4,但不适用于以前的版本。
is
语句利用了泛型类型参数的协方差,这是C#4中添加的一个特性。在C#4之前,该语句将为false。
答案 1 :(得分:3)
它有效,因为IEnumerable<T>
实际上是IEnumerable<out T>
。如果没有<T>
上的方差说明符,它将无效。
所以,只要你的界面有正确的方差说明符,并且只要两边的'T'都满足方差的类型,那就没关系。
如果没有in/out
说明符,则T必须完全匹配演员才能成功,并且CSJ提供的手动检查是唯一剩下的选项。
答案 2 :(得分:3)
x.GetGenericTypeDefinition() == typeof(IEnumerable<>) &&
typeof(IInterface).IsAssignableFrom(x.GetType().GetGenericArguments()[0]);