2010-12-02 14 views
5

Me gustaría poder crear varias estructuras con precisión variable. Por ejemplo:¿Hay interfaces compartidas por tipos de valores que representan números?

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

Sé que Microsoft se ocupa de esto mediante la creación de dos estructuras - Point (por números enteros) y PointF (para números de punto, flotante) pero si necesitaba un punto basada en bytes, o de doble precisión, luego se le pedirá que copie una gran cantidad de código antiguo y simplemente cambie los tipos de valores.

+3

Consulte esta pregunta ASÍ: http://stackoverflow.com/questions/4322383/why-dont-number-type-not-share-a-common-interface/4322432#4322432 –

+0

No sabía que podría sobrecargar a los operadores en C# ... ¡Agradable! + rep'ing :) – Machinarius

Respuesta

2

Hay una razón simple de por qué no se puede hacer lo siguiente: Los operadores son no virtual, es decir, el compilador debe saber en tiempo de compilación sip1.X+p2.X es una adición entero o una doble adición.

+0

¿No sabe el compilador en tiempo de compilación qué es T? Tal vez no debería funcionar como una interfaz, pero sería una función de lenguaje agradable de C#: la capacidad de forzar a T a ser un número, para que pueda usar +, -, * y /. – dlras2

+2

@Daniel: No, no conoce el tipo de T en tiempo de compilación ... es posible que esté desarrollando una biblioteca, por lo que el compilador no puede saber * qué * T sus clientes pasarán a su clase. – Heinzi

+0

Buen punto de la biblioteca: sé lo suficiente sobre los genéricos como para ser peligroso. Eso es muy malo, sin embargo. Deben buscar alguna solución para C# 5.0, porque esto sería realmente útil. – dlras2

Cuestiones relacionadas