请考虑以下代码:
public static void Foo()
{
Bar(null);
}
public static void Bar([NotNull] string s)
{
if (s == null)
throw new ArgumentNullException("s");
}
[NotNull]
上使用Bar
属性告诉来电者s
不应该为空。这很好用,当我将null传递给Bar
(可能'null'赋值给标记为'NotNull'属性的实体)时,我收到警告。
但它实际上并没有阻止我传递null,因此Bar
仍然必须检查s
是否为空。 那么为什么我也会在if (s == null)
(表达始终为假)上收到警告?
据我所知,这个属性含义模糊;根据具体情况,它可能意味着两件事:
我是否正确使用此属性,或者我遗失了什么?
顺便说一句,我正在使用Resharper 7 EAP,所以它可能是一个bug;但是我想在报告之前确保我的用法是正确的......EDIT2:错误报告here
答案 0 :(得分:3)
据我所知,你正确使用它并且ReSharper告诉你比较总是false
是错误的。 [NotNull]
属性只不过是文档,您的代码是正确的,可以仔细检查输入值。这不是ReSharper第一次提出错误或愚蠢的建议。关于JetBrains的一个很酷的事情就是他们有a public bug tracker你可以报告这个并直接从开发者那里获得反馈。
那就是说,(并且如果你意识到的话,请原谅我),C# 4.0's Code Contracts使这变得容易,可预测和可靠:
Contract.RequiresAlways(s != null);