UPDATE: Diese Frage war the subject of my blog on 12 April 2010. Danke für die amüsante Frage!
In der Praxis gibt es keinen Unterschied.
In Theorie könnte es einen Unterschied geben. Es gibt drei interessante Punkte in der C# -Spezifikation, wo dies einen Unterschied darstellen könnte.
Zuerst Umwandlung von anonymen Funktionen in Delegattypen und Ausdrucksbäume. Betrachten Sie folgendes:
Func<int> F1() { return()=>1; }
Func<int> F2() { return (()=>1); }
F1
ist eindeutig legal. Ist F2
? Technisch, nein. The spec sagt in Abschnitt 6.5, dass es eine Umwandlung von einem Lambda-Ausdruck zu einem kompatiblen Delegattyp gibt. Ist das ein Lambda-Ausdruck? Nein. Es ist ein geklammerter Ausdruck, der einen Lambda-Ausdruck enthält.
Der Visual C# -Compiler macht hier eine kleine Spec-Verletzung und verwirft die Klammer für Sie.
Zweitens:
int M() { return 1; }
Func<int> F3() { return M; }
Func<int> F4() { return (M); }
F3
ist legal. Ist F4
? Nein. Abschnitt 7.5.3 besagt, dass ein eingeklammerter Ausdruck keine Methodengruppe enthalten darf. Auch hier verletzen wir die Spezifikation und erlauben die Konvertierung.
Drittens:
enum E { None }
E F5() { return 0; }
E F6() { return (0); }
F5
ist legal. Ist F6
? Nein. Die Spezifikation besagt, dass es eine Konvertierung von der Literal-Null in einen beliebigen Aufzählungstyp gibt. "(0)
" ist nicht das Literal Null, es ist eine Klammer gefolgt von dem Literal Null, gefolgt von einer Klammer. Wir verletzen die Spezifikation hier und erlauben tatsächlich keine Kompilierung Zeitkonstante Ausdruck gleich Null, und nicht nur literal Null.
In jedem Fall erlauben wir Ihnen, damit durchzukommen, obwohl dies technisch illegal ist.
@Eric Lippert: Warum die Spec-Verletzungen? Ich sehe, dass Sie aus Bequemlichkeit sagen, aber wie wiegen Sie die Balance zwischen Verletzung der Spezifikation und Bequemlichkeit? War es ein Fehler, der zur Bequemlichkeit wurde? :-) – jason
Ich glaube, das letzte Wort, das du haben wolltest * illegal *? –
@Jason: Ich glaube, die Spec-Verletzungen in den ersten beiden Fällen sind einfach Fehler, die nie abgefangen wurden. Der anfängliche Bindungspass war in der Vergangenheit sehr aggressiv, Ausdrücke vorzeitig zu optimieren, und eine der Konsequenzen davon ist, dass Klammern sehr früh weggeworfen werden, früher als sie sein sollten. In fast jedem Fall macht das alles Programme, die intuitiv offensichtlich funktionieren, so, wie sie sollten, also mache ich mir keine großen Sorgen darüber. Die Analyse des dritten Falles ist hier: http://blogs.msdn.com/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx –