【发布时间】:2018-03-05 22:46:14
【问题描述】:
在为 WPF/MVVM 项目的集合创建一些虚拟数据时,我生成了以下错误代码,可以正常编译,但在运行时抛出异常。
有一个数据对象的嵌套结构,我错误地只用花括号对其进行了实例化(看起来编写 JavaScript 确实会对大脑造成永久性损害)。
using System.Collections.ObjectModel;
namespace testapp
{
class Program
{
static void Main(string[] args)
{
var collection = new ObservableCollection<TopLevelDataObject>();
collection.Add(new TopLevelDataObject{Nested = {Bar = 5}}); // NullReferenceException
}
class TopLevelDataObject
{
public NestedDataObject Nested { get; set; }
public string Foo { get; set; }
}
class NestedDataObject
{
public double Bar { get; set; }
}
}
}
为什么会编译?
如果我创建一个匿名类型,例如 Nested = new {Bar = 5},我会在编译期间收到错误消息(因此失败):
Cannot implicitly convert type '<anonymous type: int Bar>' to 'testapp.Program.NestedDataObject'
为什么我在省略new 运算符时没有收到这样的错误?
它甚至为我提供了该属性的代码提示:
我的猜测是{Bar = 5} 只是一个代码块,它本身就是一个有效的东西。
但是为什么将代码块分配给任何东西(在本例中为 Nested 属性)是有效的?
【问题讨论】:
标签: c# curly-braces object-initializers