Warum funktioniert das? Ich beschwere mich nicht, will nur wissen.Warum funktioniert das?
Antwort
Der C# -Compiler unterstützt Typ-Inferenz für Generika und auch häufig gesehen, wenn Sie das Schlüsselwort var verwenden.
Hier int
wird aus dem Kontext zu entnehmen (a
und b
) und so ist <int>
nicht benötigt. Es hält den Code sauberer und einfacher zu lesen, manchmal.
Manchmal ist Ihr Code möglicherweise klarer zu lesen, wenn Sie den Compiler auf den Typ schließen lassen. Manchmal ist es klarer, wenn Sie den Typ explizit angeben. Es ist ein Urteilsspruch über Ihre gegebene Situation.
Der Compiler leitet den generischen Typparameter aus den Typen der tatsächlichen Parameter ab, die Sie übergeben haben.
Diese Funktion macht LINQ-Aufrufe viel einfacher. (Sie brauchen nicht numbers.Select<int, string>(i => i.ToString())
zu schreiben, weil der Compiler die int
von numbers
folgert und die string
von ToString
)
Es funktioniert, weil a
und b
ganze Zahlen sind, so dass der Compiler die generische Typargument für What
ableiten kann.
In C# 3 kann der Compiler das Typargument auch dann ableiten, wenn die Typen nicht übereinstimmen, solange eine Erweiterung sinnvoll ist. Wenn beispielsweise c
eine long
wäre, würde What(a, c)
als What<long>
interpretiert werden.
Beachten Sie, dass, wenn, sagen wir, c
ein string
wäre, würde es nicht funktionieren.
Beachten Sie auch, dass wenn Sie zwei verschiedene Typen haben, die sowohl 'Parent' erweitern als auch versuchen,' What (a, b) '(wobei a und b von diesen zwei verschiedenen Typen sind), nicht zu folgern Geben Sie als 'Eltern' ein. –
@BlueRaja: das ist eigentlich der gleiche Fall, da in Dans Beispiel int und string beide Erweiterungen von Object sind. Das Design-Prinzip hier ist, dass C#, wenn er aufgefordert wird, ein "bestes" Mitglied einer Menge zu finden, immer ein Mitglied aus der Menge auswählt. Es wählt nie ein Mitglied von außerhalb des Sets. Auf die Frage, was das beste Mitglied von {Tiger, Giraffe} ist, heißt es nicht "Animal", es heißt, dass es kein bestes Mitglied gibt. –
Der Compiler ist intelligent genug, um herauszufinden, dass der generische Typ ‚int‘
Es ist für generische Methoden Typinferenz verwenden. Beachten Sie, dass diese zwischen C# 2 und 3. Zum Beispiel verändert haben, wäre dies nicht in C# gearbeitet hat 2:
What("hello", new object());
... während es würde in C# 3 (oder 4). In C# 2 wurde die Typrückschluss auf einer Argument-Basis durchgeführt, und die Ergebnisse mussten genau übereinstimmen. In C# 3 trägt jedes Argument Informationen bei, die dann zusammengesetzt werden, um die Typargumente abzuleiten. C# 3 unterstützt auch multi-phase Typ-Inferenz, wo der Compiler ein Typ-Argument ausarbeiten kann, dann sehen, ob es weitere Informationen über den Rest hat (z. B. aufgrund von Lambda-Ausdrücken mit impliziten Parametertypen). Im Grunde geht es weiter, bis es keine weiteren Informationen mehr erhalten kann, oder es endet - oder es sieht widersprüchliche Informationen. Die Typrückgabe in C# ist nicht so leistungsfähig wie der Hindley-Milner-Algorithmus, aber sie funktioniert auf andere Weise besser (insbesondere macht sie immer einen Vorwärtsfortschritt).
Weitere Informationen finden Sie in Abschnitt 7.4.2 der C# 3-Spezifikation.
Der Compiler kann den Typ T als int ableiten, da beide in What() übergebenen Parameter vom Typ int sind. Sie werden feststellen, dass viele der Linq-Erweiterungen mit Generics (als IEnumerable) definiert sind, aber in der Regel in der Art und Weise verwendet werden, die Sie anzeigen.
Wenn das Thema wie das in C# 3 funktioniert.0 ist interessant für dich, hier ist ein kleines Video von mir, das es aus dem Jahr 2006 erklärt, als wir zum ersten Mal die Version des Features für C# 3.0 entwarfen.
http://blogs.msdn.com/ericlippert/archive/2006/11/17/a-face-made-for-email-part-three.aspx
Siehe auch "Typinferenz" in meinem Blog:
http://blogs.msdn.com/ericlippert/archive/tags/Type+Inference/default.aspx
- 1. Warum funktioniert das nicht
- 2. Warum funktioniert das so?
- 3. Warum funktioniert das nicht?
- 4. Warum funktioniert das?
- 5. Warum funktioniert das Verständnis nicht?
- 6. php autoloader: warum funktioniert das?
- 7. Warum funktioniert das Recycling nicht?
- 8. (! [] + []) [+ []] ... Erklären Sie, warum das funktioniert
- 9. Warum funktioniert das? JNDI, Tomcat6
- 10. Warum funktioniert das nur einmal?
- 11. Array-Überlauf (warum funktioniert das?)
- 12. Warum das erste nicht funktioniert?
- 13. Warum funktioniert das nicht? (os.makedirs)
- 14. Warum funktioniert das "Clear" nicht?
- 15. Drucken von Servlet, warum funktioniert das nicht
- 16. asp.net vb.net Warum funktioniert das nicht?
- 17. Warum funktioniert das Neuzuweisen von Object.prototype nicht?
- 18. Warum funktioniert das slideOutLeft CSS nicht?
- 19. Warum funktioniert das Apache Event MPM schlecht?
- 20. Swift: Warum funktioniert das Umschalten zwischen Textfeldern?
- 21. Warum funktioniert das GDR-Casting nicht?
- 22. Warum funktioniert das Facebook Share-Beispiel nicht?
- 23. Warum funktioniert das folgende Javascript/Formular nicht?
- 24. Warum funktioniert das letzte Kind nicht?
- 25. Warum funktioniert das Atom-Verschönern nicht?
- 26. Warum funktioniert das Schreiben in Datei nicht?
- 27. Warum funktioniert das "include" nicht im Beispielcode?
- 28. Warum das funktioniert (Vorlagen, SFINAE). C++
- 29. Warum funktioniert das nur in Firefox?
- 30. Warum funktioniert das Hinzufügen des @ -Symbols?
Er ist das 'var' Schlüsselwort nicht verwenden. – SLaks
@SLaks: Ja, ich weiß. –
@SLaks: "'auch' häufig gesehen" – Dykam