Пример 1
Предположим метод, который решает, какой метод следует использовать для преобразования значения.
public static TTarget ConvertValue<TTarget>(object value)
{
Type t = typeof(TTarget);
if (t.IsEnum)
return ParseEnum<TTarget>(value);
else //if ...
return ...;
}
Некоторые методы, которые обрабатывают значение, имеют параметр общего типа с ограничениями.
public static TEnum ParseEnum<TEnum>(object value)
where TEnum : struct
{
//do something
return ...;
}
Компилятор не допускает такой подход, поскольку тип TTarget
не обязательно является struct
и может стать NULL
и, следовательно, не может использоваться как TEnum
.
Пример 2
Предположим, что имеется универсальный метод без ограничений и метод с дополнительными ограничениями:
public void DoStuff<T>(T obj)
{
if (obj is IComparable && obj is ICloneable)
DoSpecialStuff<T>(obj);
}
public void DoSpecialStuff<T>(T obj)
where T : IComparable, ICloneable
{
}
Это также не работает, потому что (afaik) нет возможности привести к нескольким интерфейсам.
Можно ли повторно использовать универсальный тип для вызова метода с дополнительными ограничениями?