私は C#6 で追加された安全なナビゲーション オペレーター機能を興味深くフォローしてきました。しばらく楽しみにしていました。しかし、私は予想とは異なる動作を見つけています。私はそれが実際にどのように機能するかを本当に理解していないことに気づきました。
このクラスを考えると
class Foo {
public int? Measure;
}
new 演算子を使用したコードを次に示します。
Foo f = new Foo { Measure = 3 };
Console.WriteLine(f?.Measure); // 3
f = new Foo { Measure = null };
Console.WriteLine(f?.Measure); // null
f = null;
Console.WriteLine(f?.Measure); // null
ここまでは、すべてが期待どおりに機能しています。 ?.
左辺が null でない場合はメンバーにアクセスし、それ以外の場合は null を返します。しかし、ここで事態は私が予想していなかった方向に進みます。
var i = f?.Measure; // i is Nullable<int>
Console.WriteLine(i.HasValue); // false
Console.WriteLine(f?.Measure.HasValue); // null
何?
から取得できるのに、割り当てた同じ式から取得できないのはHasValue
なぜですか? どうしてnullになることができますか?i
i
HasValue
編集:私の本当の質問は、コンパイルエラーではなく、プログラムの動作に関するものです。コンパイルに関する余分なものを削除し、同じロジックのように見えるものから 2 つの異なる結果が返される理由にこの質問を絞り込みました。