我的印象是,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# 编译器考虑所有指定元素的类型集。确实如此not考虑常见的基础类型等。
You could转换表达式之一:
var objects= new [] { obj1, obj2, (ISomething) obj3 };
...但就我个人而言,我只会使用显式形式:
var objects= new ISomething[] { obj1, obj2, obj3 };
或者,如果您明确声明了任何或全部obj1
, obj2
and 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)
以 Ei 作为参数。更多的
准确地说,推理开始于
具有不固定类型变量 X。
然后进行输出类型推断
来自类型 X 的每个 Ei。最后,X
是固定的,结果类型 S 是
由此产生的通用类型
表达式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)