C#中的数组初始化:为什么一个在运行时失败,另一个在编译时失败?

时间:2014-06-03 16:52:46

标签: c# compiler-errors

考虑以下两个程序。第一个程序在编译时因编译器错误而失败:

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)

0 个答案:

没有答案