考虑以下两个程序。第一个程序在编译时因编译器错误而失败:
using System.Collections.Generic;
class Program {
static void Main(string[] args) {
List<int> bar = { 0, 1, 2, 3 }; //CS0622
}
}
只能使用数组初始值设定项表达式来分配数组类型。请尝试使用新表达式。
我完全理解。当然,解决方法是使用new[] {...}
数组初始化程序语法,程序将编译并正常运行。
现在考虑第二个程序,只是略有不同:
using System.Collections.Generic;
public class Foo {
public IList<int> Bar { get; set; }
}
class Program {
static void Main(string[] args) {
Foo f = new Foo { Bar = { 0, 1, 2, 3 } }; //Fails at run time
}
}
该程序编译。而且,生成的运行时错误是:
对象引用未设置为对象的实例。
这对我很有意思。为什么第二个程序甚至会编译?我甚至尝试将Bar
变为实例变量而不是属性,认为这可能与奇怪的行为有关。它不是。与第一个示例一样,使用new[] {...}
数组初始化程序语法会使程序正常运行而不会出现错误。
在我看来,第二个程序不应该编译。这是问题所在。 为什么会这样?我在这里未能掌握的是什么?
(编译器:Visual Studio 2012,Framework:.NET 4.5.1)