2012-01-21 3 views
10

なぜ私に教えてくださいParameterizedThreadStartクラスは、System.object引数型だけに含まれるメソッドのみを許可します。ParameterizedThreadStartがオブジェクトパラメータのみを許可するのはなぜですか?

public class MainThreadTest 
{ 
    public static void Main(string[] args) 
    { 
     Thread T = new Thread(new ParameterizedThreadStart(DisplayYOrX)); 
     T.Start("X"); 

     DisplayYOrX("Y"); 
    } 

    static void DisplayYOrX(object outValue) 
    { 
     string Parameter = (string)outValue; 

     for(int i=0; i<10; i++) 
      Console.Write(Parameter); 
    } 
} 

私がそれについて知りたいのは、なぜ型キャスト構文を再度使用したくないかということです。

string Parameter = (string)outValue; 

答えて

15

制限の理由は、ThreadStart汎用デリゲートではありませんので、それは周りobjectを渡すことができるだけであるということです。これは、値を直接渡すラムダを使用することで回避できます。

public static void Main(string[] args) { 
    ThreadStart start =() => { 
    DisplayYOrX("X"); 
    }; 
    Thread t = new Thread(start); 
    t.Start(); 

    ... 
} 

static void DisplayYOrX(string outValue) { 
    ... 
} 

私が思うC#2.0

public static void Main(string[] args) { 
    ThreadStart start = delegate { 
    DisplayYOrX("X"); 
    }; 
    Thread t = new Thread(start); 
    t.Start(); 

    ... 
} 
+0

のバージョンは、2.0の.NET Frameworkを使用する開発者のためとして、ラムダは使いにくいです。私は正しいですか? –

+0

@Frank 2.0 C#コンパイラで動作するバージョンを含めるように答えを更新しました。注意:ラムダ構文の使用は、C#3.0以降のコンパイラを使用する場合は、2.0フレームワークでも有効です。どちらの方法でも、私がそこに置いた2番目のサンプルは、C#2.0以上のすべてで動作します。 – JaredPar

+0

2.0フレームワークでラムダ構文を使用できると言った方法に本当に関心があります。だから、どうすればいいのか教えてください。すべての参照リンク? –

関連する問題