2016-04-28 24 views
3

スレッドからUpdateResults()という非静的メソッドを呼び出そうとしています。非静的メソッドのスレッドを使用できません

class Live 
{ 
    Thread scheduler = new Thread(UpdateResults); 

    public Live() 
    { 
     scheduler.Start(); 
    } 

    public void UpdateResults() 
    { 
     //do some stuff 
    } 
} 

が、私はこのエラーを取得:これは私のコードです

A field initializer can not refer to the property, method or non-static field 'Live.UpdateResults()'

は、どのように私はこの問題を解決することができますか?

答えて

3

Threadとは関係ありません。これがなぜ起こっているのかについては、thisの質問を参照してください。 は、あなたの問題を解決し、以下のようにクラスを変更するには:

class Live 
{ 
    Thread scheduler; 

    public Live() 
    { 
     scheduler = new Thread(UpdateResults); 
     scheduler.Start(); 
    } 

    public void UpdateResults() 
    { 
     //do some stuff 
    } 
} 

ジョンスキートはC#4仕様のセクション10.5.5.2から、上記の問題に言及したよう:

A variable initializer for an instance field cannot reference the instance being created. Thus it is a compile-time error to reference this in a variable initializer, because it is a compile-time error for a variable initializer to reference any instance member through a simple-name.

あなたはnew Thread(UpdateResults)を書くときあなたは本当にnew Thread(this.UpdateResults)と書いています。

+0

を初期化するには:スレッドスケジューラ '上;'私は 'フィールド 'LiveScore.scheduler' を取得するには、割り当てられているが、その値は決してありません「使用済み」は単なる警告です。 – Dillinger

+1

コンストラクタでのみプライベートフィールドを使用しているためです。変数を別のメソッドで使用したくない場合は、コンストラクタに対してローカルにすることもできます。変数が別のメソッドから参照されるとすぐにエラーは消えます –

4

C#の6.0ソリューション:変更アサイン(=)ただ、質問=>

class Live { 
    // Please, note => instead of = 
    Thread scheduler => new Thread(UpdateResults); 

    public Live() { 
     scheduler.Start(); 
    } 

    public void UpdateResults() { 
     //do some stuff 
    } 
    } 
+0

これは実際にはフィールドからプロパティに変更されるので、=>は標準ゲッターよりも文法的な糖です – Fabjan

+0

lamba式ですか? :) – Dillinger

+1

@Dillinger:*構文*はラムダですが、実際にはイニシャライザの一種です(インスタンス作成時に値を代入します) –

関連する問題