In C# haben wir var
Datentyp, aber wir können es nicht als Funktionen Rückgabetyp verwenden.
Warum ist das nicht möglich?Warum ist es nicht möglich, eine Funktion mit VAR-Rückgabetyp zu deklarieren?
Antwort
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.
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 #. –
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
}
-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. –
ich es die Methode vermasseln Überlastung Regeln könnte denken .
- 1. Warum ist es möglich, eine Struktur und eine Nicht-Struktur mit dem gleichen Namen zu deklarieren?
- 2. Ist es möglich, Variablen prozedural mit Rust-Makros zu deklarieren?
- 3. Ist es möglich, eine Funktion zu deklarieren, die zu einer singulären Instanz einer Vorlagenklasse gehört?
- 4. Ist es möglich, einen Alias mit .net-Typ zu deklarieren?
- 5. Ist es sinnvoll, eine gelöschte Funktion als noexcept zu deklarieren?
- 6. Ist es möglich, eine Lambda-Funktion anzugeben?
- 7. Ist es möglich, eine globale Variable in PHP zu deklarieren, die von einer Funktion zugewiesen
- 8. Ist es möglich, Werte const Array-Element zu deklarieren einzeln
- 9. Warum ist es möglich, eine generische Klasse zu generieren?
- 10. Ist es möglich, eine Klasse mit einer Zeichenfolge zu instanziieren?
- 11. Warum ist es möglich, auf eine Rx zu warten?
- 12. Warum ist es möglich, Schlüsselwertpaare an eine Funktion zu übergeben, die eine Karte destrukturiert?
- 13. Warum ist es nicht möglich, Anmerkungen in Java zu erweitern?
- 14. Ist es möglich, eine Funktion in PHP zu instanziieren?
- 15. Ist es möglich, in Node.js eine JavaScript-Funktion zu erstellen?
- 16. Ist es möglich, eine Python-Funktion nicht verwendeten kwargs
- 17. Es ist nicht möglich, eine faktorielle Funktion in C
- 18. Warum ist es nicht möglich, mein Azure Dashboard zu veröffentlichen?
- 19. Warum ist es nicht möglich, range() so zu verwenden?
- 20. Ist es möglich, eine Klasse zu deklarieren, ohne sie zu implementieren? (C++)
- 21. Ist es möglich, eine virtuelle statische Konstante in einer C++ - Klasse zu deklarieren?
- 22. Ist es möglich, eine Eigenschaft zu deklarieren, welche Klasse entweder 'A' oder 'B' ist? (mehrere Klassenmöglichkeiten)
- 23. Eine Funktion in einer Funktion neu deklarieren
- 24. Mit reinterpret_cast, um eine Funktion zu void * zu werfen, warum ist es nicht illegal?
- 25. Ist es möglich, eine Funktion zu schreiben, die ein Array von n Dimensionen annehmen kann?
- 26. Ist es möglich Ref nicht in lokale Variable zu kopieren?
- 27. Javascript - Ist es möglich, eine Schleife mit Funktionen zu machen?
- 28. Gibt es eine Möglichkeit, Kovarianz zu deklarieren?
- 29. Ist es möglich, eine Methode für jeden Parameter in einem Paket zu deklarieren?
- 30. Ist es eine gute Praxis, Variablen möglichst "final" zu deklarieren?
Nun, wenn Sie nicht wissen, wie muss der Compiler wissen? – leppie