| 

.NET C# Java Javascript Exception

1
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


Viele Grüße,
Thomas Sczyrba
22.03.2011
Thomas Sczyrba 1,4k 1 2 9
4 Antworten
2
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.
22.03.2011
Matthias Hlawatsch 13,2k 4 9
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.
Thomas Sczyrba 22.03.2011
1
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 ;-)
Matthias Hlawatsch 22.03.2011
Ah, schon geschehen - danke!
Matthias Hlawatsch 22.03.2011
1
Du kannst dir eine Extension dafür schreiben:

<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


Grüße
Maria
22.03.2011
Maria Simlinger 1,1k 1 9
Danke für die Info. Allerdings ging es mir bei dem "Verständnisproblem" in erster Linie darum zu verstehen warum es so ist wie es ist.
Thomas Sczyrba 25.03.2011
0
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
22.03.2011
Daniel Kuppitz 596 1 7
Ja schon, aber jetzt nutzt Du die ForEach-Methode der Klasse List(of T), und das geht an der eigentlichen Frage vorbei.
Matthias Hlawatsch 22.03.2011
0
Danke an alle. Ich mach jetzt das hier:

Friend Overrides Sub ForceImport()
Directory.GetFiles(MyBase.ImportPath, MyBase.ImportFileExtension).ToList.ForEach(AddressOf Import)
End Sub


hätte mir aber gewünscht das es direkt auf der Statischen Methode läuft:
Friend Overrides Sub ForceImport()
Directory.GetFiles(MyBase.ImportPath,MyBase.ImportFileExtension).ForEach(AddressOf Import)
End Sub
22.03.2011
Thomas Sczyrba 1,4k 1 2 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH