2

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

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

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

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

代码:

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

2 回答 2

3

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

有关该主题的 Eric Lippert 博客文章的链接,请参阅 MailmanOdd 的回答。

于 2014-01-24T19:29:53.697 回答
2

您不能禁止空参数,您能做的最好的事情就是在违反参数前提条件时引发错误。由于您不想ArgumentNullException在 child 为 null 时抛出异常,因此我建议您使用code contracts

Contract.Requires( x != null );

它更简洁一些,如果您的先决条件被违反,您可以获得在构建时静态检查的附加选项。

于 2014-01-24T19:35:03.363 回答