你好,抱歉这个令人困惑的标题,我无法正确表达我想说的话。 关于这个问题,我应该如何解释这个片段?
public class Node
{
public long Id { get; private set; }
/// Creates a Node which has the supplied id.
public Node(long id) : this()
{
Id = id;
}
/* */
}
如果我没有错;当使用参数化构造函数创建Node时,this
关键字应该调用相同的方法,但是没有参数,我认为应该默认为默认(sic),空构造函数。最后看起来这只是另一种调用空的默认构造函数的方法,这种方法毫无意义。
如果构造函数按预期工作,那么Id
成员如何实例化?
完整的源代码在这里:http://sourceforge.net/p/satsumagraph/code/ci/master/tree/src/Graph.cs#l38
答案 0 :(得分:6)
在您的实际代码中,Node
是struct
,而不是类。
在这种情况下,需要将调用添加到默认构造函数。没有它,您会收到一条消息,指出该对象“在分配所有字段之前无法使用”,因为您在值类型中使用了自动属性。这是因为编译器添加了一个支持字段,并且必须先初始化该字段,然后才能访问该属性。构造函数尝试在初始化字段之前设置属性。每个struct
都包含一个默认构造函数,并将其称为“零初始化”自动属性的支持字段,以使其正常运行。
如您所示,使用class
,这将是不必要的(甚至不会编译)。
答案 1 :(得分:0)
根据msdn: -
构造函数可以使用this关键字调用同一对象中的另一个构造函数。与base类似,可以使用或不使用参数,构造函数中的任何参数都可以作为参数或作为表达式的一部分使用。
编译上面的代码时,它应该给你一个错误,因为你还没有定义一个无参数的构造函数。
因此,当你这样做时: -
public Node(long id) : this()
{
Id = id;
}
您正在尝试调用尚未定义的无参数构造函数。