Допустим, у меня есть следующий код:
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 он справедливо жалуется на возможное исключение System.NullReferenceException в "deck.Cards", поскольку в этом коде deck может быть нулевым. Это хорошо, я хочу сохранить это.
Тем не менее, он также будет жаловаться на c.Color и c.Value, так как в этих случаях он может быть равен нулю. Это кажется чрезмерным и менее чем полезным.
Я могу «исправить» c.Color, изменив лямбду с «c.Color == color» на «c! = Null && c.Color == color», хотя это мучительно для каждого предложения Where, особенно когда я знаю по дизайну класса, что колода. Карты не будут иметь нулевые значения.
Это не устраняет проблему c.Value, хотя ясно, что после измененного предложения "where" c не может быть нулевым.
Кажется, что нет способа написать предложение Select (...), OrderBy (...) и т. Д., Не вызывая это предупреждение.
Когда я включаю поиск возможных нулевых ссылок в моем проекте, я получаю сотни файлов с «проблемами». Мы широко используем LINQ, и поэтому многие, но не все, эти «проблемы» являются ложными, но их невозможно отключить.
Похоже, я выбираю отключить возможную проверку нулевых ссылок или аннотировать каждое отдельное использование расширения LINQ Select () комментарием. Ни один из которых действительно не работает для меня.
Существует ли третий вариант решения этой проблемы?