C#在构造函数中具有相同类型的可空对象

时间:2015-11-05 16:42:17

标签: c# nullable

以下是我的代码:

class Phrase
{
    public String Name { get; private set; }
    public Head Head { get; private set; }
    public Phrase? Complement { get; private set; }

    public Phrase(String Name, Head Head, Phrase? Complement)
    {
        this.Name = Name;
        this.Head = Head;
        this.Complement = Complement;
    }

}

这导致编译时错误说明

  

"类型'短语'必须是不可为空的值类型才能使用   它作为参数' T'在泛型类型或方法中#System; Nullable"

尝试做的是有一个可为空的类变量Complement,并允许它在构造函数中设置。我该如何做到最好?

2 个答案:

答案 0 :(得分:6)

根据错误,Phrase已经是可以为空的类型。这是因为它是一个类:

class Phrase
{
    // ...
}

作为引用类型的类始终可以为空。为了使用Nullable<T>(及其?简写语法),类型必须是非可空的。哪个是原始类型或struct

struct Phrase
{
    // ...
}

请注意,除了它们是否可以为空之外,类和结构之间存在相当大的差异。如果您希望将类型设为struct,则可能很容易对代码进行重大更改。另一方面,如果您只想在该构造函数中允许null,则默认情况下会执行此操作,只需删除?构造。

答案 1 :(得分:-3)

public String Name { get; private set; }
public Head Head { get; private set; }
public Phrase? Complement { get; private set; }

public Phrase(String Name, Head Head, Phrase? Complement)
{
    this.Name = Name;
    this.Head = Head;
    this.Complement = Complement;
}

this.Complement已经可以为空,你不能把&#34; Value&#34; Complement参数的属性,加上如果Phrase是一个类,它不应该是可空的(因为它已经是)