2011-01-11 3 views
5

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

class MyClass<T> 
{ 

... 

void MyMethod() 
{ 
    .... 
    byte value = AnotherObject.GetValue() 

    Tvalue = (T)value; 
    .... 
} 

... 

} 

Я попробовал бокс и распаковку, как:

Tvalue = (T)(object)value; 

Но это работает только в том случае, если T == byte. В противном случае я получаю InvalidCastException.

T всегда имеет тип номера (например, короткий, поплавок и т. Д.).

+0

Какова ваша цель? Можете ли вы использовать «Конвертер»? – Gabe

ответ

10

Да, вы можете только удалить значение для того же типа.

Вы пробовали использовать

Tvalue = (T) Convert.ChangeType(value, typeof(T)); 

? Вот пример:

using System; 

class Test 
{ 
    static void Main() 
    { 
     TestChange<int>(); 
     TestChange<float>(); 
     TestChange<decimal>(); 
    } 

    static void TestChange<T>() 
    { 
     byte b = 10; 
     T t = (T) Convert.ChangeType(b, typeof(T)); 
     Console.WriteLine("10 as a {0}: {1}", typeof(T), t); 
    } 
} 

Там нет ограничений здесь, хотя вы могли бы указать

where T : struct, IComparable<T> 

в качестве первого прохода. Это ограничение не имеет ничего общего с тем, что работает конверсия - просто попытаться остановить использование вызывающих абонентов неподходящего типа.

Смежные вопросы