2014-01-29 158 views
-1

你好,对于混乱的标题感到抱歉,我无法正确表达我想说的话。 关于这个问题,我应该如何理解这个片段?无参数重载构造函数调用参数化一个?

public class Node 
{ 
    public long Id { get; private set; } 
    /// Creates a Node which has the supplied id. 
    public Node(long id) : this() 
    { 
     Id = id; 
    } 
/* */ 
} 

如果我没有错;当使用参数化构造函数创建节点时,this关键字应该调用相同的方法,但不包含参数,我认为该参数应默认为默认(sic)空构造函数。最后,它看起来像是调用空的默认构造函数的另一种方式,这是毫无意义的。 如果相反,构造函数按预期工作,Id成员如何实例化?

完整的源代码是在这里:http://sourceforge.net/p/satsumagraph/code/ci/master/tree/src/Graph.cs#l38

+2

您当前的代码没有默认构造函数*(参数less)*,并且您应该会看到一个错误:'Node'不包含一个构造函数,其中包含0个参数 – Habib

+1

该代码不是实际的代码 - 您能显示真实的,实际的代码? –

+0

请注意,Graph.cs类中的实际代码显示Node是结构体,而不是类:http://sourceforge.net/p/satsumagraph/code/ci/master/tree/src/Graph.cs –

回答

6

在您的实际代码,Nodestruct,不是一类。

在这种情况下,需要将调用添加到默认构造函数。没有它,你会得到一个消息,说明对象“在所有字段分配给它之前不能使用”,因为你正在使用值类型的自动属性。这是因为编译器添加了一个后台字段,并且该字段必须在可以访问该属性之前进行初始化。构造函数试图在字段初始化之前设置属性。每个struct都包含一个默认构造函数,并将其调用为“初始化”自动属性的后台字段,以使其正常运行。

class,如你所示,这是不必要的(甚至不编译)。

+0

完美,毕竟这是我的读书错误。感谢您的解释! – Harter

0

根据msdn: -

A constructor can invoke another constructor in the same object by using the this keyword. Like base, this can be used with or without parameters, and any parameters in the constructor are available as parameters to this, or as part of an expression.

当你编译上面的代码,它应该给你一个错误,因为你还没有定义参数的构造函数。

因此,当你这样做: -

public Node(long id) : this() 
    { 
     Id = id; 
    } 

您正在试图调用参数的构造函数,你还没有定义。

相关问题