我的印象是C#编译器将基于可以全部隐式转换为它们的类型隐式键入数组。

编译器生成
找不到隐式类型数组的最佳类型

public interface ISomething {}

public interface ISomething2 {}

public interface ISomething3 {}

public class Foo : ISomething { }
public class Bar : ISomething, ISomething2 { }
public class Car : ISomething, ISomething3 { }

void Main()
{
    var obj1 = new Foo();
    var obj2 = new Bar();
    var obj3 = new Car();

    var objects= new [] { obj1, obj2, obj3 };
}

我知道纠正此问题的方法是声明如下类型:
new ISomething [] { obj1, ...}

但是我在这里寻求帮助。

最佳答案

C#编译器考虑所有指定元素的类型集。它不考虑常见的基本类型等。

您可以强制转换以下表达式之一:

var objects= new [] { obj1, obj2, (ISomething) obj3 };

...但是我个人只是使​​用显式形式:
var objects= new ISomething[] { obj1, obj2, obj3 };

另外,如果您明确声明obj1obj2obj3中的任何一个或全部为ISomething类型,那么在不更改数组初始化表达式的情况下也可以正常工作。

根据C#3规范的第7.5.10.4节:



7.4.2.13节看起来像这样:

关于c# - 隐式键入实现接口(interface)的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2799902/

10-12 23:56