C# 如果没有 'new' ,这个初始化会做什么?

标签 c# initialization

我不知道它的编译内容/方式,以及它试图做什么:

// throws null reference exception on 'get' for C1:
var c2 = new Class2 { C1 = { Value = "stg" } };

public class Class1
{
    public string Value { get; set; }
}

class Class2
{
    public Class1 C1 { get; set; }
}

很明显,初始化应该包含“new”:

var c2 = new Class2 { C1 = new Class1 { Value = "stg" } };

但是即使没有“new”,它是如何编译的,它想做什么?

最佳答案

施工

var c2 = new Class2 { C1 = { Value = "stg" } }; 

是一个语法糖,展开为

Class c2 = new Class2();

c2.C1.Value = "stg"; // <- Here we have the exception thrown

对于编译器来说,C1null 并不明显(C1 可以在构造函数中创建) )这就是代码编译的原因。

编辑:为什么编译器允许C1 = { Value = "stg"}?这方便(语法糖是为了我们的方便),想象一下:

public class Class1 {
  public string Value { get; set; }
}

class Class2 {
  // Suppose, that in 99% cases we want C1 with Value == "abc"
  // But only when Class1 instance is a property C1 of Class2
  public Class1 C1 { get; set; } = new Class1() { Value = "abc" };
}

...

// however, in our particular case we should use "stg":
var c2 = new Class2 { C1 = { Value = "stg" } };

// for some reason I recreate C1 (note "new"):
var otherC2 = new Class2 { C1 = new Class1 { Value = "stg" } };

关于C# 如果没有 'new' ,这个初始化会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70493315/

相关文章:

c++ - 初始化稀疏静态数组

c++ - C++隐式复制构造函数成员变量复制顺序

c# - 如何在没有边框的窗体周围添加阴影?

c# - 绑定(bind)命令到 ItemsControl Item

c# - 映射到关系类型时 EF Core 3 添加迁移失败

c# - 3D 立方体绕 x 和 y 轴旋转

java - JNI 可以在初始化期间调用对象上的方法吗?

c# - 具有不同数据类型数组作为值的字典

Java实例变量初始化了2次?

c++ - 尝试在类定义中声明数组时出错