この非常に単純な例があります:
_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?
ではなくbool
を返すため、bool
を生成します。 。a?.B
:ここには、bool?
があります。ただし、if
にはbool
が必要です。最初のケース(list?.Count
)では、演算子はint?
-null許容のint
を返します。
_>
演算子はNULL可能整数に対して定義されているため、int?
に値がない(NULL)場合、比較はfalse
を返します。
2番目の例(a?.B
)では、bool?
が返されます(a
がnullの場合、true
もfalse
でも、null
は返されません)。 if
ステートメントには(null不可)if
が必要なので、bool?
はbool
ステートメントでは使用できません。
そのステートメントを次のように変更できます。
if (a?.B ?? false)
再び機能させるために。したがって、null条件演算子(??
)がfalse
を返したときに、null結合演算子(?.
)はnull
を返します。
または(TheLethalCoderが示唆したように):
if (a?.B == true)