2016-04-06 8 views
1

genannt zu werden habe ich die folgenden Methoden:am besten passende überladene Methode ist nicht

Public Function RenderRateTable() As String 

    Private Function RenderRateTable(ToddVersionedObject As ToddVersionedObject, 
            FieldInfo As FieldInfo) As String 

    Private Function RenderRateTable(ArrayIndexes As List(Of ArrayIndexesAttribute.ArrayIndex), 
        ThreeDimensionalArray As ThreeDimensionalDecimalArrayType) As String 

    Private Function RenderRateTable(ArrayIndexes As List(Of ArrayIndexesAttribute.ArrayIndex), 
           TwoDimensionalArray As ArrayOfDecimalArraysType) As String 

Beachten Sie, dass die Typen, die ich zu überlasten (ArrayOfDecimalArraysType, ThreeDimensionalDecimalArrayType) sind nicht Klassen, die von der gleichen Basisklasse erben. Sie sind verschiedene Strukturen, die nichts erben. Sie wurden von jemand anderem geschrieben und ich kann sie nicht ändern.

Als ich es aus der gleichen Klasse nennen wie diese

Dim MyThreeDimensionalDecimalArrayType As ThreeDimensionalDecimalArrayType 
RenderRateTable(MyArrayIndexes, CType(MyThreeDimensionalDecimalArrayType, Object)) 

es geht nicht in die richtige Methode. Es geht einfach zu RenderRateTable().

Was noch seltsamer ist, ist der Aufruf mit zwei Argumente (Parameter) gemacht, aber diese sind (ignoriert?) Und es ruft eine Methode, die keine Parameter und keine Laufzeitfehler ausgelöst wird!

Ich habe Option Strict Off und die Variable, die ich übergeben, ist der Parameter ThreeDimensionalArray vom Typ Object.

Ich versuche es zu bekommen, wo ich eine Reihe von Überladungen habe und es wählt die richtige Methode basierend auf dem Typ der Object bestanden.

Polymorphe Methode Aufruf statt einer Select Case Anweisung. Ich hasse bedingte Blöcke so.

UPDATE

bekam ich die indem er erklärt, die Überlastungen Arbeits Code Public, aber ich verstehe immer noch nicht:

  1. Warum sollte der Disponent die richtige Private Methode nicht finden, wenn die Anruf ist innerhalb derselben Klasse.
  2. Warum der Dispatcher eine Methode ohne Parameter aufrufen würde, wenn der Aufruf mit 2 Parametern erfolgt, und keinen Fehler auslösen.
+0

Haben Sie die Absicht haben, 'RenderRateTable()' 'als Public' und der Rest als 'Private'? "Option Strict On" hätte das als Problem aufgezeigt. –

+0

@AndrewMorton, Oh ja, deshalb funktioniert es nicht. Wenn Sie dies tun, muss jeder Überlastungskandidat öffentlich sein. Kannst du eine Antwort als solche posten, kannst du Punkte bekommen? – toddmo

+0

Ich habe es in eine Antwort für Sie gemacht :) –

Antwort

3

Sie haben RenderRateTable() als Public und den Rest als Private, die sie daran hindern wird die richtige Überlastung, wenn sie von außerhalb der Klasse aufgerufen zu verwenden.

Es ist sehr wahrscheinlich, dass Option Strict On würde das als ein Problem haben darauf hingewiesen: Ich empfehle, dass Sie es verwenden, um Ihre Programmierung Bemühungen zu erleichtern :)

+0

Sie haben mir geholfen, es funktioniert, das ist die Hauptsache. Aber was hier nicht intuitiv ist, und der Grund für die Frage an erster Stelle ist, dass der Anruf von ** innerhalb der gleichen Klasse ** ist! Ich verstehe immer noch nicht, warum der Dispatcher es nicht findet. Ich habe es funktioniert, aber ich sehe immer noch nicht, warum privat nicht funktionieren würde. – toddmo

+0

@toddmo Von der Frage, "die Variable, die ich an den Parameter ThreeDimensionalArray übergebe, ist vom Typ Objekt." Dies kann die Überlastauswahl ebenfalls behindern.Ich habe etwas gehofft, dass Sie Option Strict On verwenden und dieses Problem korrigieren würden, bevor ich eine gute Erklärung finden müsste ... –

+0

Dies wird nicht mit 'Option Strict On 'kompiliert. Es gibt den Fehler 'Option Strict On' verbietet implizite Konvertierungen von 'Object' zu '' jeden Typ, für den ich eine Überladung bereitstellen will ''. 'Ich rufe diesen Parameter tatsächlich mit dem Ergebnis von' FieldInfo.GetValue' auf, das zurückgibt ein 'Objekt'. – toddmo

Verwandte Themen