Я пытаюсь преобразовать значение универсального параметра типа T значение в целое число после проверки, что T является на самом деле целым числом:
public class Test
{
void DoSomething<T>(T value)
{
var type = typeof(T);
if (type == typeof(int))
{
int x = (int)value; // Error 167 Cannot convert type 'T' to 'int'
int y = (int)(object)value; // works though boxing and unboxing
}
}
}
Хотя это работает посредством упаковки и распаковывания, это - дополнительная производительность наверху, и я блуждал, если существует способ сделать это непосредственно.
Если честно, самым эффективным способом здесь будет "боксирование" и "распаковка". Я не знаю никакого способа избежать боксирования, а любая другая форма преобразования (например, Convert.ToInt32) потенциально будет выполнять преобразования, которые вам на самом деле не нужны.
int и другие примитивы CLR реализуют IConvertible.
public class Test
{
void DoSomething<T>(T value) where T : IConvertible
{
var type = typeof(T);
if (type == typeof(int))
{
int y = value.ToInt32(CultureInfo.CurrentUICulture);
}
}
}