我最近正在研究一些代码,它已经从使用十进制变为使用具有十进制数和类型来表示分数的复杂类型。我不得不更新一些测试,并在输入时忘记添加新的关键字。编译的代码,但测试保持失败,抛出一个NullReferenceException。在那里我意识到失踪的新事物,并且该财产未被初始化。有没有人知道为什么会发生这种情况?我无法在C#lang规范中找到任何解释这一点的内容。C#复杂类型初始值设定项编译没有新的关键字
下面是代码示例:
public class Fraction
{
public int Numerator { get; set; }
public int Denominator { get; set; }
}
public class MyDecimal
{
public decimal? Decimal { get; set; }
public Fraction Fractional { get; set; }
}
public class ClassA
{
public MyDecimal Value { get; set; }
}
//...
var instance = new ClassA
{
Value = // new MyDecimal is missing here
{
Decimal = 2.0m,
Fractional = new Fraction
{
Numerator = 3,
Denominator = 4
}
}
}
请注意,我用C#6和VS 2015年,但我得到了同样的结果也LINQPad。
如果有人可以解释这一点(我看着你的方向乔恩Skeet :))我会很高兴。
对象初始值设定项是您要查找的术语。这些初始化程序在相应类的构造函数被调用后调用*。然而,在你忘记'new'关键字的情况下,你并没有把这个构造函数叫做'Value'作为'NullReference'。 – HimBromBeere
这个问题为什么标记重复?显然,它是在问为什么不需要new关键字,而不是关于如何使用对象初始化器的实际问题...... – nbokmans
不同之处在于,如果您省略了“= new MyDecimal”部分,编译器希望'Value'已经作为对现有对象的引用,并将简单导航到它并尝试为其分配属性,如“Decimal”和“Fractional”。这就是为什么你得到一个NRE。如果你把这个添加到你的'Value' **声明**中,它会起作用,但可能不是你想要的:'{get;组; } = new MyDecimal();' –