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?

71
demandé sur fero 2015-07-31 14:43:52

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.

97
répondu Jon Skeet 2015-07-31 11:46:35