鉴于:
public interface IMyInterface{
}
public class MyClass:IMyInterface{
public MyClass(){}
}
public struct MyStruct:IMyInterface{
private int _myField;
public MyStruct(int myField){_myField = myField;}
}
Run Code Online (Sandbox Code Playgroud)
我为什么要写:
IEnumerable<IMyInterface> myClassImps = new[] {
new MyClass(),
new MyClass(),
new MyClass()
};
Run Code Online (Sandbox Code Playgroud)
但不是:
IEnumerable<IMyInterface> myStructImps = new[]{
new MyStruct(0),
new MyStruct(1),
new MyStruct(2)
};
Run Code Online (Sandbox Code Playgroud)
这给了我以下警告:
错误29无法隐式转换类型 'MyApp.MyNS.MyStruct []' 为 'System.Collections.Generic.IEnumerable <MyApp.MyNS.IMyInterface>'
而且必须写成:
IEnumerable<IMyInterface> myStructImps = new IMyInterface[]{
new MyStruct(0),
new MyStruct(1),
new MyStruct(2)
};
Run Code Online (Sandbox Code Playgroud)
问题是数组协方差。这个规范讲一下:
对于任意两个引用类型 A 和 B,如果存在从 A 到 B 的隐式引用转换(第 6.1.4 节)或显式引用转换(第 6.2.3 节),则也存在从数组类型 A[ R] 到数组类型 B[R],其中 R 是任何给定的等级说明符(但对于两种数组类型都相同)
一个更简单的例子也失败了
int[] c = new int[0];
object[] d = c;
Run Code Online (Sandbox Code Playgroud)
尽管
string[] c = new string[0];
object[] d = c;
Run Code Online (Sandbox Code Playgroud)
工作正常。你基本上是在尝试做同样的事情。您有一个值类型数组MyStruct,并且尝试将其隐式转换为IMyInterface,这不在数组协方差规范中涵盖。