Неявные преобразования - это просто вызовы методов, которые вставляются компилятором во время компиляции.
Например:
CombinedType c = new SomeType1();
превращается в:
CombinedType c = CombinedType.op_Implicit(new SomeType1());
JIT не обладает знаниями для вставки этих вызовов методов. Тем не менее, дженерики расширяются во время JIT, когда вы хотите, чтобы это произошло.
Не забывайте, что ваш код также позволяет кому-то передавать T
, который не конвертируется в CombinedType
.
Однако у вас есть несколько вариантов.
Один из них:
void DoSomethingWith<T>(IEnumerable<T> stuff)
{
IEnumerable<CombinedType> converted = stuff.Select(i => i switch
{
SomeType1 s1 => (CombinedType)s1,
SomeType2 s2 => (CombinedType)s2,
_ => throw ...
});
}
Другой - что-то вроде:
public interface IConvertibleToCombinedType
{
CombinedType ConvertToCombinedType();
}
public class SomeType1 : IConvertibleToCombinedType
{
// ... or get rid of the implicit conversion, and put the logic here
public CombinedType ConvertToCombinedType() => this;
}
public class SomeType2 : IConvertibleToCombinedType
{
...
}
void DoSomethingWith<T>(IEnumerable<T> stuff) where T : IConvertibleToCombinedType
{
IEnumerable<CombinedType> converted = stuff.Select(i => ConvertToCombinedType());
...
}