C# 将null传递给方法时出现编译时错误
是否有任何方法可以避免将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
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)。