Pourquoi cette distribution est-elle redondante?
J'ai une méthode avec les surcharges suivantes:
string Call(string function, Dictionary<string, object> parameters, object body)
string Call(string function, Dictionary<string, object> parameters, JObject body)
Maintenant, j'ai ajouté une autre surcharge:
string Call(string function)
{
return Call(function, null, (JObject) null);
}
J'ai ajouté un cast à JObject
afin que le compilateur sache quelle surcharge il devrait utiliser. Mais Visual Studio me dit que la distribution est redondante. Mais pourquoi mon appel n'est-il pas ambigu sans le casting?
1 réponses
Mais pourquoi mon appel n'est-il pas ambigu sans le casting?
Parce que la surcharge avec le paramètre JObject
est "meilleure" que la surcharge avec le paramètre object
... parce que la conversion à partir de null
à JObject
est "meilleure" que la conversion à partir de null
à object
.
JObject
est plus spécifique que object
, parce qu'il y a une conversion implicite de JObject
à object
, mais pas vice-versa.
Si le paramètre final de la première méthode était string
à la place (pour exemple) alors aucune surcharge ne serait meilleure que l'autre, et l'appel serait ambigu sans la distribution.
Voir la section 7.5.3 de la spécification C# 5 pour tous les détails complexes. En particulier, la section 7.5.3.5 ("meilleur objectif de conversion") est pertinente ici.