Ответ 1
-
list?.Count > 0
: Здесь вы сравниваетеint?
сint
, даваяbool
, так как снятые операторы сравнения возвращают abool
, а не abool?
. -
a?.B
: Здесь у вас естьbool?
.if
, однако, требуетbool
.
У меня есть этот очень простой пример:
class Program
{
class A
{
public bool B;
}
static void Main()
{
System.Collections.ArrayList list = null;
if (list?.Count > 0)
{
System.Console.WriteLine("Contains elements");
}
A a = null;
if (a?.B)
{
System.Console.WriteLine("Is initialized");
}
}
}
Строка if (list?.Count > 0)
отлично компилируется, что означает, что если list
равно null
, выражение Count > 0
по умолчанию становится false
.
Однако строка if (a?.B)
выдает ошибку компилятора, говоря, что я не могу неявно преобразовывать bool?
в bool
.
Почему один отличается от другого?
list?.Count > 0
: Здесь вы сравниваете int?
с int
, давая bool
, так как снятые операторы сравнения возвращают a bool
, а не a bool?
.a?.B
: Здесь у вас есть bool?
. if
, однако, требует bool
.В вашем первом случае (list?.Count
) оператор возвращает int?
- значение с нулевым значением int
.
Оператор >
определяется для целых чисел с нулевым значением, так что если int?
не имеет значения (равно null), сравнение вернет false
.
В вашем втором примере (a?.B
) возвращается bool?
(потому что если a
имеет значение null, то возвращается true
и false
, но null
). И bool?
не может использоваться в выражении if
, поскольку инструкция if
требует (не-nullable) bool
.
Вы можете изменить этот оператор на:
if (a?.B ?? false)
чтобы он снова работал. Таким образом, оператор null-coalescing (??
) возвращает false
, когда оператор с нулевым условием (?.
) возвратил null
.
Или (как предложил TheLethalCoder):
if (a?.B == true)