Здесь происходит то, что оператор ?.
сразу вернет null
, если левая часть оператора имеет значение null
.
Итак, когда cell.Value
равно null
,первая строка работает, потому что вы делаете прямое сравнение, используя оператор ==
, который вернет bool
.Другими словами, null == field.Key
возвращает false
(если, конечно, field.Key
не равен null
).
Вторая строка не работает без преобразования, потому что если значение равно null
, тооператор ?.
возвращает null
, а остальная часть строки игнорируется (.ToString()
никогда не вызывается).Таким образом, исключение, которое вы получаете, связано с тем, что условие if
должно возвращать bool
, но вместо этого оно возвращает Nullable<bool>
.
Один из способов исправить это - просто проверитьnull
первый.Это не будет сравнивать объекты, где cell.Value == null
:
keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell =>
cell.Value != null &&
cell.Value.ToString().Equals(field.Key, StringComparison.OrdinalIgnoreCase));
Еще один способ сделать это - использовать статический метод Equals
класса string
, который позволит один или несколько * 1032.* аргументы.Это будет включать результаты, где cell.Value == null
(и будет возвращать true для тех случаев, когда field.Key
также null
):
keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell =>
string.Equals(cell.Value?.ToString(), field.Key, StringComparison.OrdinalIgnoreCase));