Вопрос: почему возникает предупреждение о возможном null, если
ProductStock здесь явно не равен null?Код:
private static IEnumerable<Error> VerifyProductQuantities(
List<ProductStock> products,
Dictionary<string, Domain.Entities.ProductStock> stocks)
{
foreach (var product in products)
{
if (!stocks.TryGetValue(product.ProductName, out var stock))
{
yield return StockErrors.ProductNotFound(product.ProductName);
}
if (stock.AvailableQuantity < product.Quantity)
{
yield return StockErrors.InsufficientStocks(
product.ProductName, product.Quantity, stock.AvailableQuantity);
}
}
}
Компилятор выдет: «Dereference of a possibly null reference» для переменной
stock.Почему так происходит?
• Метод
TryGetValue возвращает false, и тогда stock остаётся равным null. • Даже если мы отфильтровали это через
if (!TryGetValue(...)), компилятор не гарантирует, что в блоке после условия stock точно не null. • В результате в строке
if (stock.AvailableQuantity < product.Quantity) возникает предупреждение. Как исправить?
1. Добавить
continue после yield return внутри блока if (!TryGetValue(...)). Тогда компилятор поймёт, что кода после этой ветки для null не будет. 2. Либо использовать оператор
!: if (stock!.AvailableQuantity < product.Quantity) — но это безопасно только если мы уверены, что значение точно не null. 3. Более читаемый вариант — переписать логику так, чтобы работа с
stock была строго в ветке, где оно гарантированно задано. Вопрос для проверки понимания nullable reference types и поведения компилятора при анализе путей выполнения кода.
