我有一个关于使用的问题new[]
.
想象一下:
Object.SomeProperty = new[] {"string1", "string2"};
SomeProperty需要一个字符串数组.
我知道这段代码会起作用.但我想知道它在幕后做了什么.是否new[]
创建了类的实例,object
并在SomeProperty
其中将其自动转换为string
对象?
谢谢
好的,这里仍然有点混乱.
正在进行的推断与Object.SomeProperty的类型无关,而是与数组初始值设定项中表达式的类型有关.换句话说,你可以这样做:
object o = new[] { "string1", "string2" };
和o仍然是对字符串数组的引用.
基本上,编译器会查看这样的表达式:
new[] { A, B, C, D, ... }
(其中A,B,C,D等是表达式)并尝试计算出要使用的正确数组类型.它只考虑A,B,C和D(等)的类型作为数组元素类型.采用这组候选类型,它试图找到一个可以隐式转换为其他类型的候选类型.如果没有一个这样的类型,那么编译器会抱怨.
例如:
new[] { new Form(), new MemoryStream() }
不会编译 - 既MemoryStream
不能Form
转换也不能转换为另一个.然而:
new[] { GetSomeIDisposable(), new MemoryStream() }
将被视为一个IDisposable[]
,因为有从隐式转换MemoryStream
到IDisposable
.同样:
new[] { 0, 1, 3.5 } // double[] new[] { 1, 3, 100L } // long[]
这只是语法糖.编译器将在此处推断出实际需要的类型,并创建与显式构造等效的代码:
Object.SomeProperty = new string[] {"string1", "string2"};
没有new[]
在运行时执行的事情.