web-dev-qa-db-ja.com

理解しようとしていますか? C#の(null-conditional)演算子

この非常に単純な例があります:

_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)は完全にコンパイルされます。つまり、listnullの場合、式_Count > 0_はデフォルトでfalseになります。

ただし、if (a?.B)行は、_bool?_をboolに暗黙的に変換できないことを示すコンパイラエラーをスローします。

なぜ一方が他方と異なるのですか?

62
Dee J. Doena
  • list?.Count > 0:ここでは、int?intと比較し、 リフト比較演算子がbool? ではなくboolを返すため、boolを生成します。 。
  • a?.B:ここには、bool?があります。ただし、ifにはboolが必要です。
75
Heinzi

最初のケース(list?.Count)では、演算子はint?-null許容のintを返します。
_>演算子はNULL可能整数に対して定義されているため、int?に値がない(NULL)場合、比較はfalseを返します。

2番目の例(a?.B)では、bool?が返されます(aがnullの場合、truefalseでも、nullは返されません)。 ifステートメントには(null不可)ifが必要なので、bool?boolステートメントでは使用できません。

そのステートメントを次のように変更できます。

if (a?.B ?? false)

再び機能させるために。したがって、null条件演算子(??)がfalseを返したときに、null結合演算子(?.)はnullを返します。

または(TheLethalCoderが示唆したように):

if (a?.B == true)
38
René Vogt