2010-12-02 14 views
5

J'aimerais pouvoir créer différentes structures avec une précision variable. Par exemple:Existe-t-il des interfaces partagées par des types de valeur représentant des nombres?

public struct Point<T> where T : INumber 
{ 
    public T X; 
    public T Y; 

    public static Point<T> operator +(Point<T> p1, Point<T> p2) 
    { 
     return new Point<T> 
        { 
         X = p1.X+p2.X, 
         Y = p1.Y+p2.Y 
        }; 
    } 
} 

Je sais offres Microsoft avec en créant deux structures - Point (pour les entiers) et PointF (pour les nombres à virgule flottante), mais si vous avez besoin d'un point à base d'octets, ou double précision, alors vous devrez copier beaucoup d'ancien code et simplement changer les types de valeur.

+3

Voir cette question SO: http://stackoverflow.com/questions/4322383/why-dont-number-types-not-share-a-common-interface/4322432#4322432 –

+0

Vous ne saviez pas que vous pouviez surcharger les opérateurs en C# ... Agréable! + rep'ing :) – Machinarius

Répondre

2

Il y a une raison simple pour laquelle vous ne pouvez pas le faire: Les opérateurs sont non-virtuelle, à savoir, le compilateur doit savoir au moment de la compilation si p1.X+p2.X est un ajout entier ou un double addition.

+0

Le compilateur ne sait-il pas au moment de la compilation ce que T est? Peut-être que cela ne devrait pas fonctionner comme une interface, mais ce serait une fonctionnalité intéressante de C# - la possibilité de forcer T à être un nombre, de sorte que vous puissiez utiliser +, -, * et /. – dlras2

+2

@Daniel: Non, il ne connait pas le type de T au moment de la compilation ... vous pourriez développer une bibliothèque, donc le compilateur ne peut pas savoir * quel * T vos clients vont transmettre à votre classe. – Heinzi

+0

Bon point sur la bibliothèque - j'en sais juste assez sur les génériques pour être dangereux. C'est dommage, cependant. Ils devraient se pencher sur une solution pour C# 5.0, car ce serait très pratique. – dlras2

0

Non, il n'existe pas d'interface de ce type.