Por favor, siéntase libre de ofrecer más aclaraciones si mi respuesta parece desviada.
No hay restricciones genéricas en los operadores en el lenguaje C#, al menos. Como Jon Skeet ha demostrado con Unconstrained Melody, las restricciones podrían ser perfectamente válidas en el CLR.
Lo mejor que puede hacer con las limitaciones es proporcionar interfaces/clases personalizadas que expongan las acciones que necesita. No podría proporcionar la primitiva (a menos que también implemente el operador implicit
), pero al menos le permitiría crear un código genérico para la parte matemática.
Las restricciones genéricas permiten al compilador inferir los miembros disponibles en función del mínimo común denominador (según lo especificado por la restricción o la falta de). La mayoría de las veces, los genéricos no tienen restricciones y, por lo tanto, le dan solo object
semántica.
Alternativamente, evitar el uso de restricciones y utilizar
dynamic
para almacenar temporalmente la variable genérica y luego hacer la suposición (a través de la tipificación de pato) que tiene los operadores relevantes:
class Program
{
static void Main(string[] args)
{
var result = Add<int, long, float>(1, 2);
Console.WriteLine(result); // 3
Console.WriteLine(result.GetType().FullName); // System.Single
Console.Read();
}
static T3 Add<T1, T2, T3>(T1 left, T2 right)
{
dynamic d1 = left;
dynamic d2 = right;
return (T3)(d1 + d2);
}
}
Esto implica el DLR y tendrá algunos gastos generales de rendimiento (no tengo cifras exactas), especialmente si tiene la intención de que los cálculos sean críticos para el rendimiento.
no estoy seguro de lo que quiere decir "declara el mismo tipo genérico varias veces", esto funciona:
class Tuple<T1, T2> // etc.
var myTuple = new Tuple<int, int>(1, 2);
Desafortunadamente, el tipo de restricción no le permite a exigir que el tipo es compatible con los operadores de Aritmética. Lo que me parece interesante es que en el código fuente BCL para, p. Ej. 'Int32' encontrará una interfaz' IArithmetic 'en la lista de herencia que está comentada. Esto es pura especulación por mi parte, pero si Microsoft habilitó esa interfaz en el BCL, entonces quizás podría especificar 'IArithmetic ' como una restricción que le permita escribir sus propias clases genéricas con aritmética. –
Enlace a una pregunta similar: http://stackoverflow.com/q/4039694/613130 – xanatos