使用LINQ和ReSharper时,如何清除“可能的System.NullReferenceException”警告?

时间:2011-09-15 18:52:41

标签: linq resharper

假设我有以下代码:

public class Deck {
  [NotNull IEnumerable<Card> cards = new List<Cards>();
  [NotNull] public IEnumerable<Card> Cards { get; private set; }

  public void AddCard([NotNull] Card card) { cards.Add(card); }
  ...
}

public static IEnumerable<int> CardValuesOfColor(this Deck deck, Color color)
{
  var cards = deck.Cards;
  return cards.Where(c => c.Color == color).Select(c => c.Value);
}

运行ReSharper Code Inspection时,它正确地抱怨“deck.Cards”中可能存在System.NullReferenceException,因为此代码中的deck可能为null。这是件好事,我想保留这个。

但是,它也会抱怨c.Color和c.Value,因为在这些情况下c感觉可能为空。这似乎过分而且不太有用。

我可以通过将lambda从“c.Color == color”更改为“c!= null&amp;&amp; c.Color == color”来“修复”c.Color,尽管这对每个人都很痛苦Where子句,特别是当我从类设计中知道deck.Cards不会保留空值时。

这不能解决c.Value问题,即使很明显在修改后的“where”子句之后,c也不可能为null。

似乎无法在不触发此警告的情况下编写Select(...),OrderBy(...)等子句。

当我打开在项目中寻找可能的空引用时,我会收到数百个带有“问题”的文件。我们广泛使用LINQ,这些“问题”中的许多(但不是全部)是虚假的,但是不可能关闭。

我的选择似乎是关闭可能的空引用检查或注释每次使用LINQ的Select()扩展名和注释。这些都不适合我。

是否有第三种选择可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

你必须记住,ReSharper是一个静态代码分析工具,即,它会查看代码中的模式,而不考虑代码的上下文,然后根据某人的建议建议“改进”或“修复”在ReSharper(或你自己,如果你自定义设置)认为是'更好'。

静态分析的问题在于它没有关于代码意图的概念,因此您可以保证它有时会建议实际上使您的代码变得更糟的“改进”,因为它缺少适合的代码的上下文。你的代码试图表达的含义。

这与“对于每个有例外的规则”的论点相同,而使用像ReSharper这样的工具的人(像我一样)不应盲目地遵循这些建议。

在相关说明中:代码合同将帮助您解决问题