gpt4 book ai didi

C# 复杂类型初始值设定项在没有 new 关键字的情况下编译

转载 作者:太空狗 更新时间:2023-10-29 17:42:59 25 4
gpt4 key购买 nike

我最近在编写一些代码,这些代码已从使用十进制更改为使用具有十进制数和表示分数的类型的复杂类型。我不得不更新一些测试,并且在输入时忘记添加 new 关键字。代码已编译,但测试一直失败,抛出 NullReferenceException。在那里我意识到缺少新的并且该属性未初始化。有谁知道为什么会这样?我在 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 中也得到了相同的结果。

如果有人可以解释这一点(我正朝你的方向看,Jon Skeet :))我会很高兴。

最佳答案

C# 规范 5.0 将对象初始化器定义为(7.6.10.2 对象初始化器):

An object initializer specifies values for zero or more fields or properties of an object.

object-initializer:
{ member-initializer-listopt }
{ member-initializer-list , }

在详细解释之后给出了一个与您的代码非常相似的示例:

If Rectangle’s constructor allocates the two embedded Point instances

public class Rectangle
{
Point p1 = new Point();
Point p2 = new Point();
public Point P1 { get { return p1; } }
public Point P2 { get { return p2; } }
}

the following construct can be used to initialize the embedded Point instances instead of assigning new instances:

Rectangle r = new Rectangle {
P1 = { X = 0, Y = 1 },
P2 = { X = 2, Y = 3 }
};

which has the same effect as

Rectangle __r = new Rectangle();
__r.P1.X = 0;
__r.P1.Y = 1;
__r.P2.X = 2;
__r.P2.Y = 3;
Rectangle r = __r;

但是只有一个区别,这里的Point实例是在Rectangle类中初始化的,它出现在Rectangle的构造函数中。

因此语法在规范中是有效的,但是您需要确保在使用对象初始化器初始化其属性之前初始化 Value 以避免 NRE。

关于C# 复杂类型初始值设定项在没有 new 关键字的情况下编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42621232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com