C# 将null传递给方法时出现编译时错误

C# 将null传递给方法时出现编译时错误,c#,methods,C#,Methods,是否有任何方法可以避免将null传递到方法中 比如: public static string Add([not null] string word1 , string word2) { return word1 + word2; } ![enter image description here][1] string sentence = Add(null, "world"); ^^ co

是否有任何方法可以避免将null传递到方法中

比如:

   public static string Add([not null] string word1 , string word2)
        {
            return word1 + word2;
        }
![enter image description here][1]
string sentence = Add(null, "world");
                       ^^ compile error

不,编译器不是通灵的。有些情况下,编译器根本无法推断将要提前传递的内容

考虑以下内容以及编译器可能如何保护您

var rnd = new Random();
Foo(rnd.Next(2) == 0 ? "foo" : null);

不,编译器不是通灵的。有些情况下,编译器根本无法推断将要提前传递的内容

考虑以下内容以及编译器可能如何保护您

var rnd = new Random();
Foo(rnd.Next(2) == 0 ? "foo" : null);

无法在编译时检查它,因为字符串是引用类型。 常见且有用的是检查运行时并抛出ArgumentNullException。此方法的用户一旦以错误的方式使用异常,就会捕获异常

例如:

public static string Add(string word1, string word2)
{
    if (word1 == null) throw new ArgumentNullException("word1");

    return word1 + word2;
}

无法在编译时检查它,因为字符串是引用类型。 常见且有用的是检查运行时并抛出ArgumentNullException。此方法的用户一旦以错误的方式使用异常,就会捕获异常

例如:

public static string Add(string word1, string word2)
{
    if (word1 == null) throw new ArgumentNullException("word1");

    return word1 + word2;
}

如果您希望达到与示例类似的语法,可以使用PostSharp代码契约。免费版本允许您在每个项目中最多使用10个类,请查看示例。它不会给您带来编译器错误,但会简化代码。

如果您想获得与示例类似的语法,可以使用PostSharp代码契约。免费版本允许您在每个项目中最多使用10个类,请查看示例。它不会给您编译器错误,但会简化代码。

或者您可以让用户传递它并检查是否为空。如果(word1==null)抛出新的ArgumentNullException(“word1”),您应该在
Add
中使用
处理该情况。编译器如何知道对象在编译时是否为
null
?而不是
Add(null,“world”)也可以是
Add(maybeNullOrNot,“world”)。或者,您可以让用户传递它并检查是否为null。如果(word1==null)抛出新的ArgumentNullException(“word1”),您应该在
Add
中使用
if(word1==null)处理该情况。编译器如何知道对象在编译时是否为
null
?而不是
Add(null,“world”)也可以是
Add(maybeNullOrNot,“world”)@TimSchmelter:更正!:)在VisualStudio2015上与Roslyn一起使用自定义软件怎么样?它不应该在编译时,但我认为可以在编译时之前检测到。@HuorSwords:如果(word1==null)抛出新的ArgumentNullException(“word1”),那么运行时检查相对于自己使用
检查有什么好处?该代码是自我记录的,应该是该方法中的第一个。@YagneshCangi:我不明白您为什么不理解这个答案中的
Random
示例,不是吗?编译器在任何情况下都无法知道参数是否为null。当然,传递
null
显然是
null
。但是参数通常在运行时获取它的值。在这种情况下,它是Foo(“Foo”)或Foo(null),编译器可以很容易地检测到这两种情况。@TimSchmelter:Corrected!:)在VisualStudio2015上与Roslyn一起使用自定义软件怎么样?它不应该在编译时,但我认为可以在编译时之前检测到。@HuorSwords:如果(word1==null)抛出新的ArgumentNullException(“word1”),那么运行时检查相对于自己使用
检查有什么好处?该代码是自我记录的,应该是该方法中的第一个。@YagneshCangi:我不明白您为什么不理解这个答案中的
Random
示例,不是吗?编译器在任何情况下都无法知道参数是否为null。当然,传递
null
显然是
null
。但是参数通常在运行时获取它的值。在这种情况下,编译器可以很容易地检测到这两种情况的Foo(“Foo”)或Foo(null)。