我有一个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);
}
}
答案 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 );
如果您的前提条件被违反,那么您可以在构建时获得静态检查的附加选项。