如果这个问题有点痴迷我道歉但我确实喜欢我的代码,不要在resharper告诉我的地方有任何摆动的线条。
我有一个通用列表:
if (permissions.First().ImportID == this.ImportId)
{
// do stuff
}
在代码中的某个时刻我需要测试第一个元素:
if (permissions != null && permissions.First().ImportID == this.ImportId)
{
// do stuff
}
Resharper(正确地)抱怨权限可能为null,所以我接受了它的建议并添加了一个支票:
if (permissions != null && permissions.Any() && permissions.First().ImportID == this.ImportId)
{
// do stuff
}
现在我意识到我需要防止列表为空,所以我也在那里添加一个支票:
public static bool IsEmpty<T>(this IEnumerable<T> source)
{
if (source == null)
return true;
return !source.Any();
}
生活很美好,代码可以正常运行resharper很安静。意识到我将经常使用null + any()检查,我添加了一个扩展方法:
if (!permissions.IsEmpty() && permissions.First().ImportID == this.ImportId)
现在唯一的问题就是我使用它:
{{1}}
Resharper再次开始呻吟&#34;可能的空分配给标有&#34; NotNull&#34;的实体。属性&#34 ;.
那么,有没有办法让resharper知道在执行IsEmpty()之后权限永远不会为空(以同样的方式理解!= null)或者是我忽略该消息的唯一选择。
答案 0 :(得分:5)
我怀疑你可以使用R# annotation。类似的东西:
[ContractAnnotation("null => true")]
public static bool IsEmpty<T>(this IEnumerable<T> source)
{
return source == null || !source.Any();
}
我相信应给予R#足够的信息,以便在IsEmpty
返回false
时不会尝试使用空引用。