Der obige Code verursacht einen Fehler bei der Kompilierung. Wie Sie sehen können, versuche ich die Erweiterungsmethode Count(<predicate>)
zu verwenden. Ich vermute, der Fehler liegt daran, dass es eine ähnlich benannte Eigenschaft Count in List
class selbst gibt, die das Erweiterungselement versteckt.
Meine Fragen hier sind:
Muss ich meine Klasse explizit in eine andere Klasse umwandeln, um auf die Count
extension-Methode zugreifen zu können? Wenn ja, welche Klasse sollte es im obigen Szenario sein?
Warum kann der Compiler nicht aus der Verwendung schließen, dass ich auf eine Methode und nicht auf eine Eigenschaft verweise?
Umfasst das Casting einen erheblichen Overhead, wenn man bedenkt, dass dies eine stark genutzte Methode ist (die manchmal hunderte von Malen pro Sekunde aufgerufen wird)?
Ist C # in dieser Hinsicht besser als VB.NET?
Ich verwende .NET 4.0 mit VS2010, wenn das etwas zu tun hat.
BEARBEITEN
Fehlermeldung:
'
Public ReadOnly Property Count As Integer
' hat keine Parameter und seine Rückgabetyp kann nicht indiziert werden.
Sie können Me
auf IEnumerable(Of MyObject)
:
Oder verwenden Sie direkt die Methode Enumerable.Count()
:
Extension Methoden werden vom Compiler in direkte statische ( shared
in VB) Methodenaufrufe umgewandelt, also gibt es keinen Unterschied.
Hab keine Ahnung, wirklich.
Durch das Umsetzen auf den zugrunde liegenden Typ wird das Objekt selbst nicht geändert, sodass es keine Leistungseinbußen gibt (außer boxing
ist beteiligt, was hier nicht der Fall ist).
C # erlaubt keine Eigenschaften mit Parametern und es erfordert Eigenschaften, die ohne ()
aufgerufen werden, also ja, es ist besser in Situationen wie dieser.
In VB.NET beziehen sich sowohl Me.Count()
als auch Me.Count
auf Count
Eigenschaft von List(Of T
). In C # this.Count
würde auf Eigenschaft verweisen und this.Count()
würde die Erweiterungsmethode (wegen Klammern) verweisen.
Tags und Links .net linq vb.net extension-methods