Общий метод, когда один параметр типа выводится [duplicate]

Почему я должен предоставлять явно общие типы параметров. В то время как компилятор должен вывести тип?

public static T2 Cast<T1,T2>(this T1 arg) where T2 : class where T1 : class
{
    return arg as T2;
}

Пример использования:

 objOfTypeT2 = objOfTypeT1.Cast<TypeT1,TypeT2>();

По сравнению с моим желаемым использованием с более интеллектуальный компилятор:

 objOfTypeT2 = objOfTypeT1.Cast<TypeT2>();

или, может быть, я должен быть более умным: -)

Остерегайтесь предоставления типа возврата. Я хочу не предоставлять объект, который я назвал функцией на нем, метод - это метод расширения.

13
задан 18 December 2010 в 14:48

2 ответа

Я использовал решение Marc Gravell и, как и он, но я могу представить еще одну альтернативу.

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

Это было возможно в течение длительного времени, но сегодняшний C # позволяет объявлять переменную inline, которую я считаю полезным для использования.

public static void Cast<T1, T2>(this T1 arg, out T2 result) where T2 : class where T1 : class
{
    result = arg as T2;
}

Вы можете назвать это следующим образом

objOfTypeT1.Cast(out Type2 objOfTypeT2);
0
ответ дан 15 August 2018 в 16:44

Вывод не учитывает тип возврата; вы можете, однако, попытаться разделить дженерики; например, вы могли бы написать код, чтобы разрешить:

.Cast().To<Type2>()

, имея (непроверенный, только указательный)

public static CastHelper<T> Cast<T>(this T obj) {
    return new CastHelper<T>(obj);
}
public struct CastHelper<TFrom> {
    private readonly TFrom obj;
    public CastHelper(TFrom obj) { this.obj = obj;}
    public TTo To<TTo>() {
       // your code here
    }
}
16
ответ дан 15 August 2018 в 16:44
  • 1
    Помните, что я предоставляю возвращаемый тип. Я хочу не предоставлять объект, который я назвал функцией на нем, метод - это метод расширения. – Jahan Zinedine 18 December 2010 в 14:41
  • 2
    @Jani и посмотрите на пример - я не включаю тип from; просто тип адресата. – Marc Gravell♦ 18 December 2010 в 15:27
  • 3
    Да, я бы сказал, что это единственный обходной момент на данный момент. – Lorenz Lo Sauer 3 September 2016 в 19:48

Другие вопросы по тегам:

Похожие вопросы: