2010-11-18 10 views
0

Wenn Sie eine leere IEnumerable vom Typ T erstellen möchten, können Sie es mit der statischen generische MethodeWarum ist IEnumerable.Empty <T>() und nicht IEnumerable <T> .Empty()?

Enumerable.Empty<T>() 

here für weitere Informationen siehe erstellen.

Warum hat Microsoft diese Option gewählt, anstatt eine statische Methode für den generischen Typ zu verwenden (im Gegensatz zu einer generischen statischen Methode für den nicht-generischen Typ)?

Enumerable<T>.Empty() 

die dann zurückkehren würde eine leere IEnumerable<T>:

Diese Methode könnte wie folgt verwendet werden.

Meiner Meinung nach macht die zweite Option mehr Sinn, da was ich erstellen möchte, ist das generische IEnumerable<T>, kein nicht-generisches IEnumerable.

Edit: Tippfehler

+0

Es ist 'Enumerable.Empty ' 'nicht IEnumerable.Empty ' – spender

+0

FYI meinen Sie Enumerable.Empty nicht IEnumerable.Empty , Sie nicht auf einer Schnittstelle statisch haben kann. –

+0

Ja, sobald ich meine Frage geschrieben habe, wurde mir klar, dass der Grund dafür war, dass Sie offensichtlich keine statischen Methoden auf einer Schnittstelle haben können. Auch Enumerable existiert nicht. – GuiSim

Antwort

12

IEnumerable<T> ist eine Schnittstelle.
Schnittstellen können keine statischen Elemente enthalten.

Die statische Methode ist tatsächlich auf dem Enumerable-Typ, der eine nicht-generische static Klasse ist.
Daher gibt es keine Enumerable<T> generische Klasse, die die Methode enthalten könnte.

Static members on generic types should be avoided.
Erweiterungsmethoden kann nicht in einem generischen Typ platziert werden.
Dies ist der Grund, warum die statische Klasse Enumerable nicht generisch ist.

+0

Warum wurde das abgelehnt? – SLaks

+0

Das Lesen der msdn-Seite, ich bin mir nicht sicher, warum ich statische Elemente auf generischen Typen böse bin. – GuiSim

+0

@Gui: Sie sind nicht böse; Sie sind nur verwirrend. – SLaks

3

Es gibt eine statische Klasse namens Enumerable, für die diese Methode definiert ist. Es gibt keine statische Klasse namens Enumerable<T>. Dies liegt daran, dass Enumerable Erweiterungsmethoden auf IEnumerable<T> definiert (alle diese Methoden haben einen generischen Parameter T) und Erweiterungsmethoden können nicht in generischen Klassen leben. Aus diesem Grund ist Empty<T> als solche definiert.

Von §10.6.9 der Spezifikation:

Erweiterungsmethoden können nur in nicht-generischen, nicht-verschachtelten statischen Klassen deklariert werden.

Verwandte Themen