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?
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.
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.
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)
Sie können diese Situation angehen, indem Sie das Schlüsselwort default verwenden, und der Code lautet:
%Vor%Oder
%Vor%null
könnte entweder ein string
oder ein ArrayList
sein. Sie müssen es wie (string) null
. ArrayList
veraltet ist? Sie sollten stattdessen einen der generischen Auflistungstypen verwenden 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.
Tags und Links c# ambiguous-call