вывод универсального типа - универсальный тип универсального типа

Это чисто эстетическая вещь, но я думаю, что все же стоит спросить. В следующем коде:

interface IGiveResult<TResult>
{
    TResult GetResult();
}

static class ResultGetter
{
    GetResultFrom<TResultGiver, TResult>(TResultGiver giver) where TResultGiver : IGiveResult<TResult>
    {
        return giver.GetResult();
    }
}

Чтобы вызвать GetResultFrom, мне нужно указать оба параметра типа следующим образом:

ResultGetter.GetResultFrom<SomeGiverType, SomeResultType>(someGiverInstance);

Тем не менее, я хотел бы назвать это так:

ResultGetter.GetResultFrom<SomeGiverType>(someGiverInstance);

В конце концов, у компилятора есть вся информация, необходимая для вывода второго универсального типа. Однако это не компилируется. Можно ли изменить этот код, чтобы не указывать тип результата?


person vidmartin    schedule 26.07.2021    source источник
comment
Повторно открыт, так как подход в stackoverflow.com/questions/10719557 на самом деле здесь не работает, я думаю . Подход в этом вопросе привел бы к коду ResultGetter<SomeGiverType>.GetResultFrom(someGiverInstance), но я не думаю, что это поможет в этом случае. Однако я не совсем уверен, и у нас нет полного примера для работы (чтобы было легко проверить).   -  person Jon Skeet    schedule 26.07.2021
comment
Вывод типа - все или ничего. Вы либо позволяете ему выводить все типы, либо явно предоставляете все типы   -  person Damien_The_Unbeliever    schedule 26.07.2021
comment
Кроме того, имейте в виду, что я вижу, что очевидные замены не означают, что компилятор может быть построен для применения соответствующих замен, чтобы прийти к тем же выводам, что и вы.   -  person Damien_The_Unbeliever    schedule 26.07.2021
comment
Возможно ли это очень расплывчато... и лично я думаю, что ответ Джона мог бы работать, учитывая информацию, которую вы предоставили здесь (т.е. очень мало). Если вы застряли с имеющейся у вас подписью, то вывод типа не работает из аргументов и не делает частичного вывода. Если вы хотите изменить способ объявления фактических типов, которые вы используете, дубликаты предлагают ряд альтернатив, которые могут вам подойти.   -  person Peter Duniho    schedule 26.07.2021
comment
Пример, вероятно, сокращен/укорочен. Параметр типа TResultGiver кажется излишним, поскольку вам не нужно знать точный тип TResultGiver для вызова GetResult и возврата TResult. GetResultFrom<TResult>(IGiveResult<TResult> giver) кажется адекватной подписью, и тогда ее можно легко вывести. На самом деле весь статический класс кажется избыточной оболочкой, поскольку вы можете вызвать GetResult прямо из giver. Но, скорее всего, это связано с демонстрацией, а не с реальным кодом.   -  person lidqy    schedule 26.07.2021