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

Вычисление неполного типа

У меня есть общий метод, подобный этому (упрощенная версия):

public static TResult PartialInference<T, TResult>(Func<T, TResult> action, object param)
{
    return action((T)param);
}

В приведенном выше примере param имеет тип object. Это часть требования.

Когда я заполняю типы, я могу назвать это следующим образом:

var test1 = PartialInference<string, bool>(
    p => p.EndsWith("!"), "Hello world!"
);

Однако я бы хотел использовать вывод типа. Предпочтительно, я хотел бы написать следующее:

var test2 = PartialInference<string>(
    p => p.EndsWith("!"), "Hello world!"
);

Но это не компилируется. Самое лучшее, что я придумал, это:

var test3 = PartialInference(
    (string p) => p.EndsWith("!"), "Hello world!"
);

Причина, по которой я хотел бы иметь это как параметр типа и все еще иметь правильно напечатанный тип возврата, потому что мои фактические вызовы выглядят примерно так:

var list1 = ComponentProvider.Perform(
    (ITruckSchedule_StaffRepository p) => p.GetAllForTruckSchedule(this)
)

Это очень уродливо, и я бы очень хотел написать что-то вроде этого:

var list2 = ComponentProvider.Perform<ITruckSchedule_StaffRepository>(
    p => p.GetAllForTruckSchedule(this)
)
4b9b3361

Ответ 1

Вы можете разделить t на общий метод на общий тип:

class Foo<TOuter> {
    public static void Bar<TInner>(TInner arg) {...}
}
...
int x = 1;
Foo<string>.Bar(x);

Здесь int выводится, но строка явно.

Ответ 2

То, чего вы пытаетесь достичь, невозможно. Вам нужно указать как общие аргументы, так и ни один из них, если вывод возможен.