Hallo Allerseits, ich habe ein Verständnisproblem bei dem Aufruf einer Statischen Methode. Hier möchte ich es Anhand von Array.ForEach darstellen. Meine Frage ist wieso der Aufruf von ForEach auf einer Instanzvariablen scheitert. (letzten beiden Codezeilen)
Friend Overrides Sub Import(ByVal fileName As String) MsgBox(fileName) End Sub
Friend Overrides Sub ForceImport() Dim files As String() = Directory.GetFiles(MyBase.ImportPath, MyBase.ImportFileExtension)
'Das geht Array.ForEach(files, AddressOf Import)
'Nachfolgende 2 Zeilen produzieren diese Exeption 'Fehler 2 Für den Parameter "action" von "Public Shared Sub ForEach(Of T)(array() As T, action As System.Action(Of T))" wurde kein Argument angegeben.
'Das geht nicht - aber warum?! :-( files.ForEach(AddressOf Import) 'Exception files.ForEach(Sub(p) Import(p)) 'Exception End Sub
Die ForEach-Methode ist eine statische Methode - Du brauchst dafür keine Instanz, um darauf zugreifen zu können, und der Compiler setzt das auch durch. In den beiden markierten Codezeilen fehlt obendrein das erste Argument - ForEach verlangt (eben weil es als statische Methode konzipiert ist), das Array als erstes Argument.
Da könntest Du recht haben - vermutlich hat mich die Funktionalität der linq extension methods irritiert. Wäre ForEach eine Extension würde man files.ForEach machen können.
Ich habe das Ganze auch gerade mal mit C# probiert. C# bietet bei files. im Gegensatz zu VB.NET gar kein ForEach über intellisense an.
Stimmt, es sieht fast aus wie eine Erweiterungsmethode - in C# fehlt gerade mal das Wort "this" vor dem ersten Parameter. Aber die Methode gibt es schon länger, schon vor Linq und steht damit einer Erweiterungsmethode mit dme gleichen Namen entgegen. Vielleicht ist das sogar der Grund, warum es keine ForEach-Erweiterungsmethode für IEnumerable gibt (hab ich mich nämlich schon immer mal gefragt, wieso). Übrigens: Du müßtest jetzt auch bewerten können ;-)
<System.Runtime.CompilerServices.Extension()> _ Public Sub ForEach(ByVal stringArray() As String, _ ByVal arrayAction As Action(Of String)) Array.ForEach(Of String)(stringArray, arrayAction) End Sub
Friend Overrides Sub ForceImport() Dim path = MyBase.ImportPath Dim ext = MyBase.ImportFileExtension Dim files As List(Of String) = Directory.GetFiles(path, ext).ToList() files.ForEach(AddressOf Import) 'keine Exception :)' End Sub
Ich habe das Ganze auch gerade mal mit C# probiert. C# bietet bei files. im Gegensatz zu VB.NET gar kein ForEach über intellisense an.