Wenn Sie solche "generische" Arithmetik machen wollen, ist Ihre Option in einer stark typisierten Sprache wie C# ziemlich begrenzt. Marc Gravell described the problem as follows:
.NET 2.0 eingeführt Generika in die .NET-Welt, die die Tür für viele elegante Lösungen für bestehende Probleme öffnete. Generische Constraints können verwendet werden, um die Typargumente auf bekannte Interfaces etc. zu beschränken, um den Zugriff auf Funktionalität zu gewährleisten - oder für einfache Gleichheits-/Ungleichheitstests die Comparer<T>.Default
und EqualityComparer<T>.Default
Singletons implementieren bzw. IEqualityComparer<T>
(erlaubt uns beispielsweise das Sortieren von Elementen ohne zu haben etwas über das betreffende "T" wissen).
Bei all dem gibt es immer noch eine große Lücke, wenn es um Betreiber geht. Da Operatoren als statische Methoden deklariert sind, gibt es keine IMath<T>
oder eine ähnliche äquivalente Schnittstelle, die alle numerischen Typen implementieren; und in der Tat würde die Flexibilität der Betreiber es sehr schwer machen, dies sinnvoll zu tun. Schlimmer: Viele der Operatoren primitiver Typen existieren nicht einmal als Operatoren; stattdessen gibt es direkte IL-Methoden. Um die Situation noch komplexer zu machen, erfordert Nullable <> das Konzept der "hebelten Operatoren", wobei das innere "T" die Operatoren beschreibt, die für den Nullable-Typ gelten - dies ist jedoch als Sprachfunktion implementiert und wird nicht von der Laufzeit (macht Reflektion noch mehr Spaß).
jedoch, C# 4.0 eingeführt, um die dynamic
Schlüsselwort, das Sie die richtige Überlastung zur Laufzeit verwenden können, wählen:
using System;
public class Program
{
static dynamic Min(dynamic a, dynamic b)
{
return Math.Min(a, b);
}
static void Main(string[] args)
{
int i = Min(3, 4);
double d = Min(3.0, 4.0);
}
}
Sie sollten sich bewusst sein, dass diese Art Sicherheit entfernt und Sie können Ausnahmen zur Laufzeit erhalten Wenn die dynamische Runtime keine geeignete Überlast zum Aufrufen finden kann, z weil du Typen gemischt hast.
Wenn Sie Typsicherheit erhalten möchten, sollten Sie sich die Klassen in der MiscUtil Bibliothek ansehen, die generische Operatoren für grundlegende Operationen bereitstellen.
Bitte beachten Sie, dass Sie, wenn Sie nur nach bestimmten Operationen sind, möglicherweise die Schnittstellen verwenden, die die integrierten Typen bereits implementieren. Zum Beispiel kann eine typsichere generic Min
Funktion könnte wie folgt aussehen:
public static T Min<T>(params T[] values) where T : IComparable<T>
{
T min = values[0];
foreach (var item in values.Skip(1))
{
if (item.CompareTo(min) < 0)
min = item;
}
return min;
}
@Saeed: Das ist der Punkt. =) Meine Add-Methode ist nur ein einfaches Beispiel. In meinem Fall mache ich eine grundlegende statistische Analyse für ein gegebenes Array von Zahlen und es ist mir egal, ob es sich um int, double, decimal oder BigIntegers handelt, solange ich sie hinzufügen kann. (und müssen diese Methoden in vielen Überladungen nicht schreiben) – Jens
https://referencesource.microsoft.com/#mscorlib/system/int32.cs,31 - 'IArithmetic' scheint auskommentiert zu sein, leider :( –
Caramiriel