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

C# have nullable object of same type in constructor

下面是我的代码:

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;
    }

}

这会导致编译时错误

"The type 'Phrase' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Nullable"

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

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 已经可以为 null,您不能将 Complement 参数的 "Value" 属性 放入,另外如果 Phrase 是 Class 则不应该可为空(因为它已经是)

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

class Phrase
{
    // ...
}

类 是引用类型,始终可为空。为了使用 Nullable<T>(及其 ? shorthand 语法),类型必须是不可空的。这将是原始类型或 struct:

struct Phrase
{
    // ...
}

请注意,classes 和结构之间存在 相当大的 差异,除了它们是否可为 null 之外。如果你想让你的类型成为 struct,那很容易对你的代码做出非常重大的改变。另一方面,如果您只是想在该构造函数中允许 null 那么默认情况下它会这样做,只需删除 ? 构造。