C# 创建一个可以';不能接收空参数

C# 创建一个可以';不能接收空参数,c#,class,generics,compile-time,non-nullable,C#,Class,Generics,Compile Time,Non Nullable,我有一个节点类,它基本上由一个父属性和一个子属性列表组成。 有一个AddChild方法不应该接收null作为参数。用户不得添加空的子项 但是parent属性必须允许空值(根节点的父节点为空) 问题是“如何禁止用户在编译时添加空子级”。我知道我可以添加一个NullArgumentException,但这不是我需要的 另一种方法是创建一个不接受空项的列表(编译时) 代码: 类节点 { 公共节点父节点{get;set;} 私有列表子项=新列表(); 公共void AddChild(节点???子节点)其

我有一个
节点
类,它基本上由一个
父属性和一个子属性列表组成。
有一个
AddChild
方法不应该接收null作为参数。用户不得添加空的子项

但是
parent
属性必须允许空值(根节点的父节点为空)

问题是“如何禁止用户在
编译时添加空子级”
。我知道我可以添加一个
NullArgumentException
,但这不是我需要的

另一种方法是创建一个不接受空项的列表(编译时)

代码:

类节点
{
公共节点父节点{get;set;}
私有列表子项=新列表();
公共void AddChild(节点???子节点)其中????
{
//我不想添加(如果Child==null)抛出新ArgumentNullException();
添加(Child);
} 
}
这是C语言设计的一个“缺点”。有一种方法可以使值类型(
struct
)可为null(
nullable
),但无法指定引用类型参数不应为null。最好的方法是检查null并抛出
ArgumentNullException
(或者按照pnewook的建议使用代码契约)


请参阅MailmanOdd的答案,以获取Eric Lippert关于该主题的博客文章的链接。

您不能禁止空参数,最好是在违反参数前提条件时引发错误。既然您不想在child为null时抛出
ArgumentNullException
,我建议您这样做


更简洁一点,如果违反了先决条件,您可以在构建时添加静态检查选项。

C#不支持此功能。您不想在AddChild方法中使用if条件检查是否传递了null参数,这背后的原因是什么?与此密切相关:I would阅读C#中为什么没有不可为空的类型。目前这不是C#的一个特性,而是一个非常有趣的读物。就我个人而言,我不认为抛出异常有什么错。如果有人正在调用
AddChild
并得到一系列异常,这将使他们首先考虑向您发送一个空的
节点。这是一个好主意,尝试将其反转并使节点成为一个结构,虽然
parent
可以
null
…但我会考虑后果…@Daniel,不幸的是,这行不通。结构是一种值类型,因此不能让一个节点“指向”另一个节点。使用类的方法是正确的,但您必须接受手动空检查。抱歉……我不理解“在构建时静态检查”的含义……使用Visual Studio的一点工具,您可以在构建过程中运行检查,以查看是否有代码以违反约定的方式调用方法。它是“静态”的,因为代码不是实际运行的,只是经过计算。
class Node
{
    public Node Parent { get; set; }
    private List<Node> Children = new List<Node>();

    public void AddChild<Maybe a generics solution?>(Node???? Child) where ????
    {
        //I don't want to add (if Child == null) Throw new ArgumentNullException();
        Children.Add(Child);
    } 
}
Contract.Requires( x != null );