实现接口的数组的隐式类型

Vin*_*cio 9 c# implicit-typing

我的印象是C#编译器将隐式地键入一个基于一个类型的数组,它们都可以隐式转换为.

编译器为隐式类型数组生成 No best type

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 };
}
Run Code Online (Sandbox Code Playgroud)

我知道纠正这种情况的方法是声明类型:

new ISomething [] { obj1, ...} 
Run Code Online (Sandbox Code Playgroud)

但是我在这里有一个封面类型的帮助.

Jon*_*eet 14

C#编译器会考虑所有指定元素的类型集.它并没有考虑公共基类等.

可以转换其中一个表达式:

var objects= new [] { obj1, obj2, (ISomething) obj3 };
Run Code Online (Sandbox Code Playgroud)

...但我个人只是使​​用明确的形式:

var objects= new ISomething[] { obj1, obj2, obj3 };
Run Code Online (Sandbox Code Playgroud)

或者,如果您显式声明了任何或所有obj1,obj2以及obj3类型ISomething,那么在不更改数组初始化表达式的情况下也可以正常工作.

从C#3规范,第7.5.10.4节:

第三种形式的数组创建表达式称为 隐式类型的数组创建表达式.它与第二种形式类似,不同之处在于未明确给出数组的元素类型,而是确定为数组初始值设定项中表达式集的最佳公共类型(第7.4.2.13节).

第7.4.2.13节看起来像这样:

在某些情况下,需要为一组表达式推断出通用类型.特别是,以这种方式可以找到隐式类型数组的元素类型和具有块体的匿名函数的返回类型.直观地,给定一组表达式E1 ... Em这个推断应该等同于调用方法

Tr M<X>(X x1 … X xm)
Run Code Online (Sandbox Code Playgroud)

以Ei为论据.更确切地说,推理从一个未固定的类型变量X开始.然后输出类型推断来自每个类型为X的Ei.最后,X是固定的,结果类型S是表达式的结果公共类型.