2017-11-14 20 views
0

これは重複している可能性がありますが、この動作を説明するスレッドは見つかりません。 Action(少なくとも基本的に戻り型のないFunc)には関係しません。それは静的な参照と関係がある。System.Actionおよび非静的変数

これらの2つの例を見てください。私はただSystem.Action OnButton1Downを購読して、Action.Invoke()で呼び出されたときに非静的関数を呼び出すようにしようとしています。

最初の方法は機能しますが、2番目または3番目の方法は機能しないのはなぜですか?私はむしろActionを保存/作成しなければなりませんので、私は単に行うことによって、策略なしに再びそれを解除することができます:OnButton1Down - =

System.Action OnButton1Down; 

void MyNonStaticFunction() { } 

// This example works 
void MyFirstFunction() 
{ 
    OnButton1Down +=() => { MyNonStaticFunction(); }; 
} 


// This example gives the following error on "MyNonStaticFunction()": 
// "A field initializer cannot reference the non-static field, method 
// or property MyNonStaticFunction()." 
System.Action MyAction =() => { MyNonStaticFunction(); }; 

void MySecondStartFunction() 
{ 
    OnButton1Down += MyAction; 
} 

// This example is to show what happens, if I just try to subscribe the raw 
// method to the Action, as suggested in the comments. 
// It gives the following error on "MyNonStaticFunction()": 
// "Cannot implicitly convert type 'void' to type 'System.Action'." 
void MyThirdStartFunction() 
{ 
    OnButton1Down += MyNonStaticFunction(); 
} 

私は一種のエラーが意味をなすことを理解し、私はしないでください最初の例がOKである理由を参照してください。むしろ他の例のどちらかをやることができるはずです。

+2

コードを画像ではなくテキストとして送信してください。それをVisual Studioにコピーして貼り付け、問題を再現して解決策を試すことができます。 –

+0

'_playerInput.OnButton1Down + = MyNonStaticFunction;'と書いているのはなぜですか? 'OnButton1Down'はどのようにdelcared/typedですか? –

+0

ここで言及したC#8でこれを許可しようとしています。https://www.kenneth-truyers.net/2016/01/20/new-features-in-c-sharp-7/ ... FYI – thanatorr

答えて

1

コンパイラでは、オブジェクトが完全に構築される前にインスタンスメンバーにアクセスすることはできません(つまり、すべてのフィールド初期化子が実行されています)。

これを回避するには、クラスコンストラクタでMyActionを初期化できます。このコンストラクタは、すべてのフィールド初期化子の後に実行されます。

編集:あなたの質問の後半部分に返信するには:

OnButton1Down += MyNonStaticFunction(); 

あなたがデリゲートにそれを変換しない、MyNonStaticFunctionを呼んでいます! ()を削除すれば、よりうまくいくでしょう!

+0

ありがとうございました!これは欠けている部分だった。非静的メソッドをコンストラクタ内の一時アクション変数に割り当てることができます。完璧! –

関連する問題