2016-08-17 3 views

Antwort

4

Ein Lambda kann in eine beliebige Anzahl möglicher delegate s oder Ausdrucksbäume umgewandelt werden. Ein Action ist ein spezifischer Delegattyp. Es gibt keine Constructor für Thread, die speziell eine Action akzeptiert.

Hier wird speziell die Lambda in eine ThreadStart Delegierten umgewandelt.

2

Der Grund ist, dass der Thread Konstruktor keine Action nimmt, dauert es ein ThreadStart Delegat.

Der Compiler wird die richtige Art für Sie schließen, wenn Sie einen Lambda-Ausdruck verwenden, was bedeutet, dass die beiden Teile des Codes wie folgt aussieht:

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

und

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

So in der zweiten Fall Sie haben gesagt "Dies ist ein Action" und dann wird der Compiler keine Überladung des Konstruktors finden, die eine Action nimmt, und dann einen Compiler-Fehler erzeugen.

Sie könnten sagen, dass der Compiler automatisch Code injizieren könnte, der dies nur konvertiert hat, da sie beide Delegaten ohne Parameter mit einem void Rückgabetyp sind, aber es nicht tut.

1

Das Lambda im ersten Ausdruck ergibt einen ThreadStart delegiert, wobei der zweite Ausdruck ist ein Action, und es gibt keine Umwandlung zwischen ThreadStart und Action.

Dies würde die Arbeits äquivalent für Ihren zweiten Ausdruck sein:

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