2016-08-17 6 views
0

私が説明できない何かを資金提供するとき、私はマルチスレッドを実験していました。次のコードは、エラーなしでコンパイルして動作します:アクションとの相違点<T>とパラメータとしてのプレーンラムダ

new Thread(() => Console.WriteLine("Hello")).Start(); 


この1つはないのに対し:

Action a =() => Console.WriteLine("World"); 
new Thread(a).Start(); 

なぜ、これら二つの違いは何ですか?

答えて

4

ラムダは、任意の数の可能な数のdelegateまたは式ツリーに変換できます。 Actionは、固有のデリゲートタイプです。 Actionを受け入れるThreadConstructorはありません。

ここで具体的には、LambdaThreadStartデリゲートになります。

2

理由は、ThreadコンストラクタがActionを受け取らないため、ThreadStartデリゲートが必要なためです。あなたは2つのコードは次のように見えることを意味し、ラムダ式を使用する場合

コンパイラはあなたのための右のタイプを推測します:

new Thread(new ThreadStart(() => Console.WriteLine("Hello"))).Start(); 

Action a = new Action(() => Console.WriteLine("World")); 
new Thread(a).Start(); 

をので、第二に「これはActionです」と言った場合、コンパイラはActionを受け取り、コンパイラエラーを生成するコンストラクタのオーバーロードを検出しません。

void戻り値の型のパラメータを持たないデリゲートの両方であるため、コンパイラはこれを変換したばかりのコードを自動挿入できます。

1

あなたの最初の式でラムダは、第二式はActionあるThreadStartデリゲートを、生成、およびThreadStartAction間の変換はありません。

これがあなたの第二の発現のための作業と同等のようになります。

ThreadStart a =() => Console.WriteLine("World"); 
new Thread(a).Start(); 
関連する問題