Ich habe eine Methode mit folgenden Überladungen:
string Call(string function, Dictionary<string, object> parameters, object body)
string Call(string function, Dictionary<string, object> parameters, JObject body)
Jetzt habe ich eine weitere Überladung hinzugefügt:
string Call(string function)
{
return Call(function, null, (JObject) null);
}
Ich habe eine Besetzung hinzugefügt, JObject
damit der Compiler weiß, welche Überladung er verwenden soll. Aber Visual Studio sagt mir, dass die Besetzung redundant ist. Aber warum ist mein Anruf ohne die Besetzung nicht mehrdeutig?
c#
casting
overloading
Fero
quelle
quelle
null
istnull
, aber die Besetzung hier ist ein Hinweis, welche Überladung verwendet werden sollte.JObject
Überlastung , auch wenn ich zu werfen nicht ,JObject
weil es die meisten spezifische Überlastung verwendet, die die Parameter übereinstimmt, undnull
alles bieten kann undJObject
ist spezifischer alsobject
. Eine ausführliche Erklärung finden Sie in der Antwort von Jon Skeet.Antworten:
Weil die Überladung mit dem
JObject
Parameter "besser" ist als die Überladung mit demobject
Parameter ... weil die Konvertierung vonnull
nachJObject
"besser" ist als die Konvertierung vonnull
nachobject
.JObject
ist spezifischer alsobject
, weil es eine implizite Konvertierung vonJObject
nach gibtobject
, aber nicht umgekehrt.Wenn der letzte Parameter für die erste Methode
string
stattdessen wäre (zum Beispiel), wäre keine Überladung besser als die andere, und der Aufruf wäre ohne die Umwandlung mehrdeutig.In Abschnitt 7.5.3 der C # 5-Spezifikation finden Sie alle Einzelheiten. Insbesondere ist hier Abschnitt 7.5.3.5 ("besseres Conversion-Ziel") relevant.
quelle
null
wird der aufrufende Code durch das Nicht- Umwandeln der aufrufenden Code sehr spröde, da das Hinzufügen fast jeder zusätzlichen Überladung vom Referenztyp den aufrufenden Code, der nicht umwandelt, beschädigen würde. Ich würde keine Besetzung einer Nullreferenz als "redundant" betrachten, wenn es eine realistische Möglichkeit für zusätzliche Überladungen vom Referenztyp gibt, die mehrdeutig werden könnten, oder sogar in Fällen, in denen eine bestimmte Überladung von als "besser" eingestuft wird die Regeln, aber es ist alles andere als offensichtlich, dass es in jedem praktischen Sinne besser ist.null
. Kennen Sie Sprachen, die solche Dinge tun?nullptr_t
, die als Parametertyp verwendet werden können. Nullzeigerliterale können jedoch immer noch implizit in Zeigertypenint
und Objektzeigertypen konvertiert werden, sodass die Überlastungsauflösung nicht viel hilft. Eine nachfolgende Liste variabler Parameter (...
) in C ++ (alle Versionen) ist ziemlich gut darin, eine bestimmte Überladung weniger bevorzugt zu machen.