创建无法接收空参数的方法或列表

时间:2014-01-24 19:27:15

标签: c# class generics compile-time non-nullable

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

但是parent属性必须允许空值(根节点具有空父级)。

问题是“如何禁止用户在compile-time添加空子项?”。我知道我可以添加NullArgumentException,但这不是我需要的。

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

代码:

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

2 个答案:

答案 0 :(得分:3)

这是C#语言设计的“缺点”。有一种方法可以使值类型(struct T)可以为空(Nullable<T>),但是无法指定引用类型参数不应为null。您可以做的最好的事情是检查null并抛出ArgumentNullException(或使用代码契约,如pnewhook建议的那样)。

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

答案 1 :(得分:2)

您不能禁止空参数,您可以做的最好的事情是在违反参数前提条件时引发错误。由于如果child为null,您不想抛出ArgumentNullException,我建议code contracts

Contract.Requires( x != null );

如果您的前提条件被违反,那么您可以在构建时获得静态检查的附加选项。