2017-01-25 8 views
1

私は私の仕事でC#MVCのWebアプリを継承しましたし、直接、次のようになり、コントローラクラスの内部の割り当てがあります:この場合、 "=>"割り当ては動作しますが、 "="は動作しません。

public class FooController : Controller 
{ 
    private IAuthenticationManager AuthenticationManager => HttpContext.GetOwinContext().Authentication; 
} 

Visual Studioは、エラーで「のようなものを、それを強調し、期待"しかし、それはコンパイルされ、うまく動作します。 "=>"を単純な代入 "="に変更すると、HttpContextに "静的でないフィールドbla bla bla ...のオブジェクト参照が必要です"というエラーが表示され、コンパイルされません。

ここに私の質問があります。なぜ "=>"演算子をコンパイルして正しく動作させるのですか?私はC#(Android/iOS開発から来たもの)が新しくなっているので、いくつかのことを理解するのは簡単ですが、このようなことは私には難解です。

+1

誰かがさらにあなたを啓発しますが、 '=>'はc#6.0で導入された特別な構文であり、それは式本体の機能です。あなたのVSのインスタンスのように聞こえ、あなたのランタイム環境は異なるバージョンをターゲットにしています –

+1

[C#でのプロパティのシグニチャとは何ですか?]の可能な複製(http://stackoverflow.com/questions/31764532/what-is- c-assignment-in-a-property-signature) – Filburt

+0

ありがとう@CallbackKid私はそれを調べます。 – whitaay

答えて

12

=>は割り当てられていません。これは、C#6で追加されたショートカットの構文砂糖であり、 "Expression-bodied function members"と呼ばれています。

それは同じことだ:

private IAuthenticationManager AuthenticationManager 
{ 
    get { return HttpContext.GetOwinContext().Authentication; } 
} 

編集:答えは明確にするためにBradleyDotNETからのコメントを追加:具体的に

を。それはプロパティのゲッターにメソッド呼び出しを返しているので、割り当て上で動作します(許可されていない)、初期化時にクラスのメンバーへのメソッドの戻り値を代入しようとしていない

の詳細については、this MSDN articleを参照してください。

+1

C#6でこの追加が大好きで、私はいつも使っています。 1行の読み取り専用プロパティのグループを持つことは、6より前の構文を持つプロパティのクラスタに比べて驚異的です。私はまた、C#7の変更が、セッターと同様のことを行うオプションを追加することで動作を拡張するのを楽しみにしています。 – Abion47

+1

ラムダ式での使用とどれほど似ているかを考えてもそれほど砂糖ではありません。それはうまく一貫しています。 –

+0

@BradleyDotNETそれは私にははるかに明確になりました。ありがとうございました。 – whitaay

関連する問題