Подтвердить что ты не робот

Почему этот литой лишний?

У меня есть метод со следующими перегрузками:

string Call(string function, Dictionary<string, object> parameters, object body)
string Call(string function, Dictionary<string, object> parameters, JObject body)

Теперь я добавил еще одну перегрузку:

string Call(string function)
{
    return Call(function, null, (JObject) null);
}

Я добавил приведение к JObject, чтобы компилятор знал, какую перегрузку он должен использовать. Но Visual Studio говорит мне, что литье является излишним. Но почему мой вызов неоднозначен без приведения?

4b9b3361

Ответ 1

Но почему мой вызов неоднозначен без приведения?

Поскольку перегрузка с параметром JObject "лучше", чем перегрузка с параметром object... потому что преобразование с null в JObject "лучше", чем преобразование из null до object.

JObject более специфичен, чем object, потому что существует неявное преобразование от JObject до object, но не наоборот.

Если окончательный параметр для первого метода был вместо string (например), то ни перегрузка не была бы лучше, чем другая, и вызов был бы неоднозначным без трансляции.

См. раздел 7.5.3 спецификации С# 5 для всех сложных деталей. В частности, здесь применим раздел 7.5.3.5 ( "лучшая цель преобразования" ).