2010-02-21 7 views
3

Je dois calculer dans une classe générique. J'ai trouvé quelques solutions comme ici: Solution for overloaded operator constraint in .NET generics, mais j'ai besoin de calibrer T avec double. est-il possible de lancer T pour doubler? Je peux donc écrire du code comme ceci:Fonctionnement avec générique et double

class Myclass<T>{ 
    T value; 
    public double Half() { 
    return i.value/2; 
    } 
} 

Myclass<int> i = new Myclass<int>(); 
double x = i.Half(); 

Merci!

+0

ne devrait-il pas être 'return this.value/2;' dans votre exemple de code? – M4N

Répondre

2

Geenrics et les opérateurs ne se mélangent pas. Dans 4.0, vous pouvez utiliser dynamic pour cela; jusque-là, a MiscUtilDivideInt32 qui devrait fonctionner parfaitement pour des cas comme:

T half = Operator.DivideInt32(value, 2); 

Cependant, dans speciailizing double ne sera pas vraiment bien fonctionner. Vous pouvez aussi commencer avec double (au lieu de T) dans ce cas. Vous pouvez utiliser ToString et Parse, mais ce n'est pas ni robuste ni efficace.

Edit - il y a aussi Convert, vous pouvez donc essayer :

return Operator.Convert<T,double>(value)/2; 
1

La réponse à la question que vous avez lié est correct: vous ne pouvez pas vraiment faire cela en C#.

Le mieux que vous pouvez faire est de re-mettre en œuvre la méthode Half une fois pour chaque type possible:

public double Half() { 
    if (typeof(T) == typeof(double)) 
     return HalfDouble(); 
    else if (typeof(T) == typeof(int)) 
     return HalfInt(); 
    else if (typeof(T) == typeof(decimal)) 
     return HalfDecimal(); 
    // etc. 
} 
0

Qu'est-ce que vous pourriez à est de faire le constructeur de la classe accepte un paramètre de type Func<T,double> qui convertit votre T à un double. Dans la fonction double Half(), vous appelez ce foncteur et diviser le résultat par 2.

Pour plus d'informations sur cette technique, lisez « Effective C# de » Bill Wagner.

Questions connexes