作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
给定:
public interface IMyInterface{
}
public class MyClass:IMyInterface{
public MyClass(){}
}
public struct MyStruct:IMyInterface{
private int _myField;
public MyStruct(int myField){_myField = myField;}
}
为什么我可以写:
IEnumerable<IMyInterface> myClassImps = new[] {
new MyClass(),
new MyClass(),
new MyClass()
};
但不是:
IEnumerable<IMyInterface> myStructImps = new[]{
new MyStruct(0),
new MyStruct(1),
new MyStruct(2)
};
这给了我以下警告:
错误 29 无法将类型“MyApp.MyNS.MyStruct[]”隐式转换为“System.Collections.Generic.IEnumerable
并且必须改为:
IEnumerable<IMyInterface> myStructImps = new IMyInterface[]{
new MyStruct(0),
new MyStruct(1),
new MyStruct(2)
};
最佳答案
问题是数组协方差。 This specification谈谈它:
For any two reference-types A and B, if an implicit reference conversion (Section 6.1.4) or explicit reference conversion (Section 6.2.3) exists from A to B, then the same reference conversion also exists from the array type A[R] to the array type B[R], where R is any given rank-specifier (but the same for both array types)
一个同样失败的更简单的例子是
int[] c = new int[0];
object[] d = c;
同时
string[] c = new string[0];
object[] d = c;
工作正常。你基本上是在尝试做同样的事情。您有一个值类型数组 MyStruct
,并且您试图将其隐式转换为 IMyInterface
,这不在数组协方差规范中。
关于c# - IEnumerable<IMyInterface> 隐式来自 Class[] 但不是来自 Struct[]。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5825276/
我是一名优秀的程序员,十分优秀!