Mehrdeutiger Aufruf von Funktion / Konstruktor in C #

7

Der folgende Code verursacht einen Compilerfehler, da es ein mehrdeutiger Aufruf ist, aber das Problem, wenn wir object anstelle von ArrayList verwenden, tritt kein Fehler auf und die string Version funktioniert einwandfrei; Haben Sie eine Erklärung dafür?

%Vor%     
Ahmed Said 19.05.2010, 12:25
quelle

6 Antworten

16

Der Grund, warum Ihr Code gut funktioniert, wenn Sie den Konstruktor ändern, der ein ArrayList zu einem object nimmt, ist, dass der C # -Compiler den spezifischsten anwendbaren Typ auswählt. Im Fall von string / object , leitet sich string tatsächlich von object ab und ist daher "spezifischer" und wird vom Compiler abgeleitet. Mit string gegen ArrayList sind es Äpfel und Orangen: Beide können null sein, aber keiner ist "spezifischer" als der andere.

    
Dan Tao 19.05.2010, 12:32
quelle
4

Ich könnte mich irren, aber ich denke, der Grund dafür, dass Sie ArrayList in ein Objekt ändern, ist, dass String von Objekt erbt und sich dafür entscheidet, die spezifischere String-Version zu verwenden. Wenn es String und ArrayList ist, weiß es nicht, welches zu verwenden ist.

    
juharr 19.05.2010 12:32
quelle
3

null könnte entweder ein string oder ein ArrayList darstellen. Es gibt keine Informationen darüber, welche Version der Methode (in diesem Fall ein Konstruktor) gemeint ist.

Sie können es durch Casting dazu zwingen, ein bestimmtes zu verwenden:

%Vor%

... oder alternativ das Implementieren eines Konstruktors, der sich wie gewünscht verhält (der keinen Parameter akzeptiert)

    
Rowland Shaw 19.05.2010 12:27
quelle
2

Sie können diese Situation angehen, indem Sie das Schlüsselwort default verwenden, und der Code lautet:

%Vor%

Oder

%Vor%     
Faheem Ijaz 21.03.2014 10:38
quelle
1
  1. Natürlich ist es mehrdeutig: null könnte entweder ein string oder ein ArrayList sein. Sie müssen es wie (string) null .
  2. qualifizieren
  3. Wussten Sie, dass ArrayList veraltet ist? Sie sollten stattdessen einen der generischen Auflistungstypen verwenden
John Saunders 19.05.2010 12:29
quelle
1

ArrayList und string sind beide nullable Arten. Das verwirrt den Compiler.

Wenn Sie zwei Konstruktoren haben, sagen Sie einen, der den NULL-Typ, z. ArrayList und andere, die non-nullable Typ benötigen, z. %Code%. Der Code kompiliert und wählt den Konstruktor mit int type.

Aber wenn Sie mehr als einen Konstruktor haben, der nullable type annimmt, dann mögen Sie @ Dan Tao sagte es ist Äpfel und Orangen: beide können null sein, aber keiner ist" spezifischer "als der andere.

zum Beispiel:

%Vor%

    Dieser Code wird kompiliert     Aber wenn Sie nullable in public A(int x)t ändern, wird es NICHT.

    
Pratik Deoghare 19.05.2010 12:47
quelle

Tags und Links