2014-09-03 5 views
5

Ich habe die folgenden zwei Methoden:Passing Variante Array-Methode erzeugt „Type Mismatch“ Fehler

Sub Start() 
    Dim x As Dictionary 
    Set x = New Dictionary 
    Call x.Add("first", 1) 
    MsgBox TypeName(x.Items) 'Displays "Variant()" 
    Call Test(x.Items) 
End Sub 

Sub Test(withArray() As Variant) 

End Sub 

Mein Projekt verweist auf „Microsoft Scripting Runtime“ die Dictionary Klasse oben verwendet bereitzustellen. Trotz der Tatsache, dass x.Items gibt eine Variant() (wie von MsgBox TypeName(x.Items) gezeigt, erhalte ich den folgenden Compiler-Fehler auf Call Test(x.Items):

Typenkonflikt: Array oder benutzerdefinierter Typ

erwartete Was ist falsch ?

Hinweis: wenn ich ändern, um die Test Methode:

Sub Test(withArray) 
    MsgBox TypeName(withArray) 
End Sub 

Es ist erfolgreich und zeigt Variant() an. Warum kann ich das Argument nicht explizit als Variant() Typ deklarieren?

+1

Nizza Frage und schön [Tipp] (http://stackoverflow.com/questions/1537819/byref-and-byval-in-vbscript) @mehow. Ich benutze immer 'Call', weil ich auf einen Blick erkennen kann, dass eine Routine aufgerufen wird. Und auch, weil die Argumentliste in Klammern eingeschlossen sein muss (das Aufrufen einer Routine mit vielen Argumenten ohne Klammern und Kommas ist einfach zu seltsam für meine Augen). Jetzt kenne ich alle Gründe hinter der Klammer, danke! – feelthhis

+0

Ich stimme zu, große Frage und gute Antwort. Ich gebe das ein Kopfgeld in 2 Tagen –

+1

ja, wo du @mehow :) –

Antwort

8

Items ist ein Variant vom nicht deklarierten Typ, was bedeutet, soweit der Compiler betroffen ist, könnte es alles zur Laufzeit sein - nicht unbedingt ein Array. Natürlich wissen wir, dass es ein Array sein wird, weil es Teil eines Dictionary ist, aber es hat keinen deklarierten Typ (Object Browser zeigt an, dass es eine Funktion ohne Rückgabetyp ist), so dass es standardmäßig Variant ist. Da der Compiler nicht garantieren kann, dass es zur Laufzeit ein Array sein wird, lässt es die Deklaration, die Sie versuchen, in der Test() - Prozedur nicht zu. Zur Laufzeit wird es ein Array, so TypeName() zeigt es als Variant()

Interessanterweise tut VBA Zuordnung zu einer Variante Array ermöglichen, so dass dies funktioniert:

Sub Start() 
    Dim x As Dictionary 
    Dim y() As Variant 
    Set x = New Dictionary 
    Call x.Add("first", 1) 
    MsgBox TypeName(x.Items) 'Displays "Variant()" 
    y = x.Items ' this is fine 
    Call Test(y) 'this works 
End Sub 

Sub Test(withArray() As Variant) 

End Sub 
+0

Perfekt, danke! –