2015-03-07 5 views

Odpowiedz

1

Nie, nie możesz. Jeśli użyjesz tej metody tylko z typami wartości, możesz określić ograniczenie struct, w przeciwnym razie nie będziesz mógł ograniczać wartości T, aby być, float, int, double.

Istnieje sposób, aby pozbyć się błąd kompilatora, można box wartość następnie wrzucił go z powrotem, ale nie jest to dobry pomysł i praktyka, ponieważ będzie to nie powieść, jeśli typ x i T nie są kompatybilne:

T y = (T)(object)x 
+2

Nie można unbox pływaka do int, choć. – Random832

+0

tak, nie możesz. dlatego nie jest to dobra praktyka. –

3

Niestety, nie można mieć tego typu ograniczenia. Można jednak użyć metody Convert.ChangeType.

class A<T> 
{ 
    void foo() 
    { 
     int x = 0; 
     T y = (T)Convert.ChangeType(x, typeof(T)); 
    } 
} 

to nie powstrzyma cię od instancji klasy z typem, który nie może być przekształcony z int, choć.

3

int, zmiennoprzecinkowe, podwójne słowa kluczowe to po prostu cukier syntaktyczny. Kompilator odwzorowuje je na typy wartości, takie jak Int32, Float, Double itp. (Które są strukturami). Generalnie nie można wymusić typ T być tylko prymitywny typ ale można nakładać T, aby być typem wartość wykonując:

class A<T> 
    where T : struct 
{ 
    void foo() 
    { 
     int x = 0; 
     T y = (T)Convert.ChangeType(x, typeof(T)); 
    } 
} 

Należy pamiętać, że nadal trzeba używać Convert.ChangeType jako wskazany przez Random832. Nałożenie typu T na strukturę jest tylko wykluczeniem klas (które nie są typami wartości). To nie jest wielka zaleta, ale myślę, że jest czystsza.

Mimo to istnieje podobne pytanie: here.

nadzieję, że to pomaga.

1

mogę zasugerować jeden ze sposobów, aby to zrobić (ale to daleko od bycia elegancki, szczerze mówiąc):

interface IConvertsFromNumeric<T> 
{ 
    T FromLong(long x); 
    T FromDouble(double x); 
    T FromDecimal(decimal x); 
} 

class A<T> 
    where T : IConvertsFromNumeric<T>, new() 
{ 
    void foo() 
    { 
     int x = 0; 
     T y = new T().FromLong(x); 
    } 
} 
+0

Nie można tego zrobić, aby obsłużyć predefiniowane typy. Utknąłeś z interfejsami, które już implementują, nie możesz dodać własnego. – hvd

Powiązane problemy