2016-09-02 6 views
3

次のコードを確認して、なぜコンパイラエラーが発生しているのかを視覚化してください。空コンディショナリング演算子は代入に使用できません。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Sample smpl = GetSampleObjectFromSomeClass(); 

     //Compiler Error -- the left-hand side of an assignment must be a variable property or indexer 
     smpl?.isExtended = true; 
    } 
} 

public class Sample 
{ 
    public bool isExtended { get; set; } 
} 

null条件付けは、プロパティ、変数などにアクセスするためだけであり、割り当てには使用しないことを推論する必要がありますか?

注:私は同様の投稿(下記のリンク)を参照しましたが、十分な議論ができていないようです。 Why C# 6.0 doesn't let to set properties of a non-null nullable struct when using Null propagation operator?

編集:私の期待は適切ではないよう 私は

If(null!= smpl) 
{ 
smpl.isExtended = true; 
} 

のようなものを期待していたらしいです!

+0

smplがnullの場合はどうなりますか? –

+0

私はisExtendedプロパティをそのままにします。私には、これはelse節なしのIfでなければなりません。 –

+0

@sstan私はすでに私のコメントで、私は答えが役に立たなかったと投稿しました。 –

答えて

5

あなたの控除は正しいです。 null条件付き演算子は、メンバーアクセスでのみ機能し、代入では機能しません。

私は、プロパティの割り当てが実際にメソッド呼び出しにコンパイルされているので、言語/コンパイラはプロパティの割り当て(ただしフィールドではない)にオペレータを使用できるようにする必要があると言います。完全に有効なコードになります

smpl?.set_isExtended(true); 

コンパイルプロパティの割り当ては次のようになります。

一方、現在は存在しないプロパティとフィールドの使用の間に構文の不一致が導入され、コードを推論するのが難しくなるという議論をするのは簡単です。

コードプレックスのC# 6.0 design notesのほとんどにアクセスすることもできます。私は簡潔なスキャンを行い、ヌル条件付きの議論は多くのセクションにわたっています。

3

のコード行の意味を考えてみましょう:

smpl?.isExtended = true; 

もしsmplあなたはnullに値を代入しようとするだろう、nullました。どちらが理にかなっていない。ただ、値を代入

は、ヌルがチェックする必要はありません。

smpl.isExtended = true; 

基本的には、ヌル伝播オペレータはにそれらを設定読ん値のための、ないのために使用されるべきです。

var x = someObject?.someProperty; 

概念的には、これが意味することはsomeObjectが存在する場合xsomePropertyの値が代入されるということです。このコード行を考えてみましょう。存在しない場合(null)、xnullになります。逆に、この平均値?:

someObject?.someProperty = x; 

は概念的に、これはsomeObjectが存在する場合は、その後、xsomePropertyを設定することを意味するだろうか、

。しかし存在しない場合は(null)、nullxに設定しますか?これは意味をなさない:

null = x; 
+0

@David –

+0

@Vivek_Shukla:私も答えを更新しました。基本的には、どちらの場合でもコード内で何が起こるかを考慮します( 'null'と' null'ではない)。これらの2つのケースのうちの1つは意味をなさない。コンパイラはそれを拒否します。 – David

+1

'someObject'が存在する場合、' someObject.set_someProperty(x) 'を呼び出すことはできません。 –

関連する問題