Non esitate a offrire ulteriori chiarimenti se la mia risposta sembra fuori luogo.
Non ci sono limiti generici sugli operatori nel linguaggio C#, almeno. Come Jon Skeet ha dimostrato con Unconstrained Melody, i vincoli potrebbero effettivamente essere perfettamente validi nel CLR stesso.
Il meglio che si può fare con i vincoli è fornire interfacce/classi personalizzate che espongono le azioni necessarie. Non saresti in grado di fornire la primitiva (a meno che tu non implementi anche l'operatore implicit
), ma ti consentirebbe almeno di creare codice generico per la parte matematica.
I vincoli generici consentono al compilatore di dedurre i membri disponibili in base al minimo comune denominatore (come specificato dal vincolo o dalla mancanza di). Il più delle volte, i generici non sono vincolati e quindi ti danno solo la semantica object
.
alternativa, evitare l'uso di vincoli e utilizzare
dynamic
per memorizzare temporaneamente la variabile generico e poi fare l'ipotesi (tramite digitazione anatra) che ha gli operatori interessati:
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);
}
}
Ciò comporta la DLR e avrà alcuni overhead delle prestazioni (non ho cifre esatte), soprattutto se si intende che i calcoli siano critici dal punto di vista delle prestazioni.
io non sono sicuro di quello che vuoi dire "dichiara lo stesso tipo generico più volte", questo funziona:
class Tuple<T1, T2> // etc.
var myTuple = new Tuple<int, int>(1, 2);
Purtroppo, il vincolo di tipo non consente di richiedere che il tipo di supporti operatori aritmetici. Quello che trovo interessante è che nel codice sorgente BCL per es. 'Int32' troverai un'interfaccia' IArithmetic 'nell'elenco di eredità che è commentato. Questa è pura speculazione da parte mia, ma se Microsoft ha abilitato quell'interfaccia nel BCL, potresti forse specificare 'IArithmetic ' come un vincolo per consentire di scrivere le tue classi generiche con l'aritmetica. –
Link a domande simili: http://stackoverflow.com/q/4039694/613130 – xanatos