2010-11-09 2 views

Antwort

12

Ich glaube, dass es teilweise auf das Design des Compilers zurückzuführen ist. Eric Lippert blogged über warum Felder kann nicht implizite Typisierung verwenden, und ich vermute, einige der gleichen Argumente für Methoden halten.

Aber Sie könnten leicht mit Zweideutigkeit sowieso enden. Zum Beispiel:

var Method1(bool callMethod2) 
{ 
    return callMethod2 ? Method2() : null; 
} 

var Method2() 
{ 
    return Method1(false); 
} 

Was sollte der Typ hier sein?

Ein einfacheres Beispiel:

var Method1(bool throwException) 
{ 
    if (!throwException) 
    { 
     return Method1(true); 
    } 
    throw new Exception("Bang!"); 
} 

Zwar ist diese Art von Mehrdeutigkeit einfach nicht zugelassen werden könnte, aber ich vermuten dass das Design-Team das Gefühl, dass die zusätzliche Komplexität von Design und Implementierung nicht wert war der Nutzen . Vergessen Sie nicht, dass sie mit begrenzten Ressourcen laufen - mit einer Wahl zwischen var für Methoden und async/await, würde ich das letztere innerhalb eines Herzschlags wählen. (Zwar gibt es andere Funktionen, die ich statt dynamic abgeholt haben würde, aber das ist eine andere Sache ...)

Beachten Sie, dass Typinferenz Rückkehr ist für Lambda-Ausdrücke durchgeführt, so dass die Idee der es nicht ist verrückt. Zum Beispiel:

IEnumerable<string> x = new[] { "x", "y", "z" }; 

var result = x.Select(s => { return s.Length; }); // Long form 

Es folgert der Compiler den vollständigen Typ des Lambda-Ausdruck, wenn es die Überladungsauflösung auf Select führt es zu einer Func<string, int> konvertieren. Es ist nicht undenkbar, die gleichen Ideen auf Methoden anzuwenden - einfach kompliziert.

+4

Ihre Analyse ist wie immer genau richtig. Um diese Funktion richtig nutzen zu können, muss * die gesamte Programmanalyse * durchgeführt werden, was erhebliche Auswirkungen auf die Architektur und die Performance des Compilers hat. Außerdem gelten alle Gründe für "no var on fields". Zum Beispiel haben wir keine standardisierte Möglichkeit, einen anonymen Typ in einer öffentlichen API darzustellen. Wenn Sie eine Sprache möchten, die diese Art von Inferenz ermöglicht, versuchen Sie F #. –

2

var ist kein Datentyp in C#. Deshalb können Sie es nicht als Rückgabeparameter verwenden. Der Compiler leitet den Typ zur Kompilierzeit von der rechten Seite der Zuweisung ab und berücksichtigt, dass zur Kompilierungszeit bekannt ist, dass Sie den realen Typ als Rückgabewert verwenden müssen. In C# 4.0 können Sie den dynamic-Typ:

public dynamic myFunction() 
{ 
    var = some operations 
} 
+0

-1, weil das, was vorgeschlagen wird, einfach ist, dass der Compiler folgern sollte, was der reale Rückgabetyp ist ... eine Deklaration machend, die 'var' verwendet, äquivalent zu der gleichen Methodendeklaration mit einem expliziten Rückgabetyp, abgeleitet von den Rückgabeanweisungen innerhalb der Methodenkörper. Es ist nicht undenkbar - nur kompliziert. Beachten Sie, dass dies bereits für Lambda-Ausdrücke gemacht wurde, wie im Beispiel in meiner Antwort gezeigt. –

-2

ich es die Methode vermasseln Überlastung Regeln könnte denken .

Verwandte Themen