IEnumerable <IMyInterface>隐式来自类[]但不来自Struct [].为什么?

Gro*_*ile 10 c#

鉴于:

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)

Yur*_*ich 4

问题是数组协方差。这个规范讲一下:

对于任意两个引用类型 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,这不在数组协方差规范中涵盖。