2011-01-11 4 views
5

Je voudrais savoir s'il y a une contrainte spécifique pour les types numériques qui permet la coulée de travailler dans le cas suivant:Conversion de type béton numérique type générique numérique

class MyClass<T> 
{ 

... 

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

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

... 

} 

J'ai essayé la boxe et unboxing comme:

Tvalue = (T)(object)value; 

Mais cela ne fonctionne que si T == byte. Sinon, je reçois un InvalidCastException.

T est toujours un type de nombre (comme short, float, etc.).

+0

Quel est votre but? Pouvez-vous utiliser 'Converter'? – Gabe

Répondre

10

Oui, vous ne pouvez déballer qu'une valeur du même type.

Avez-vous essayé d'utiliser

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

? Voici un exemple:

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); 
    } 
} 

Il n'y a pas de contrainte ici, bien que vous pouvez spécifier

where T : struct, IComparable<T> 

comme une première passe. Cette contrainte n'a cependant rien à voir avec la conversion: il s'agirait simplement d'essayer d'empêcher les appelants d'utiliser un type inapproprié.

Questions connexes