gpt4 book ai didi

c# - IEnumerable 隐式来自 Class[] 但不是来自 Struct[]。为什么?

转载 作者:可可西里 更新时间:2023-11-01 09:13:14 26 4
gpt4 key购买 nike

给定:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com