21

私は 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になることができますか?iiHasValue

編集:私の本当の質問は、コンパイルエラーではなく、プログラムの動作に関するものです。コンパイルに関する余分なものを削除し、同じロジックのように見えるものから 2 つの異なる結果が返される理由にこの質問を絞り込みました。

4

4 に答える 4

2
var i = f?.Measure; // i is Nullable<int>
Console.WriteLine(i.HasValue); // false
Console.WriteLine(f?.Measure.HasValue); // null

この場合、f は null です。

i.HasValue返さfalseれる理由はi、タイプが であるためですNullable<int>。したがってi、この場合のように の値が null の場合でも、i.HasValue引き続きアクセスできます。

ただし、が評価されるとf?.Measure.HasValueすぐに戻ります。したがって、上記の結果が得られます。nullf?

ロブのコメントを引用するだけです:

f?.Measure.HasValue を (f?.Measure).HasValue として読んで理解していることを理解する必要がありますが、これは違います。

于 2017-02-23T19:43:58.247 に答える
0

Nullable<T>は実際には構造体であるため、null にすることはできません。それのみがValue可能であるため、HasValue常にアクセスできます。

于 2015-08-28T01:41:56.600 に答える