Überladung des arithmetischen Operators der generischen C#-Klasse
Das Definieren arithmetischer Operatoren mithilfe generischer Klassen in C# kann eine Herausforderung sein. Dies gilt insbesondere dann, wenn ein generischer Typ auf einen bestimmten Typ beschränkt ist, der arithmetische Operationen unterstützt. Lassen Sie uns ein konkretes Szenario untersuchen, um diese Herausforderung zu veranschaulichen und eine mögliche Lösung anzubieten.
Betrachten Sie die folgende generische Klassendefinition zur Modellierung eingeschränkter Zahlen:
<code class="language-csharp">public class ConstrainedNumber<T> : IEquatable<ConstrainedNumber<T>>, IEquatable<T>, IComparable<ConstrainedNumber<T>>, IComparable<T>, IComparable where T : struct, IComparable, IComparable<T>, IEquatable<T></code>
Diese Klasse stellt eine begrenzte Anzahl dar und unterstützt Gleichheitsvergleiche und natürliche Reihenfolge. Um jedoch arithmetische Operationen an Instanzen dieser Klasse durchzuführen, müssen wir die entsprechenden Operatoren definieren.
Eine Möglichkeit besteht darin, einen Operator wie diesen zu definieren:
<code class="language-csharp">public static T operator +(ConstrainedNumber<T> x, ConstrainedNumber<T> y) { return x._value + y._value; }</code>
Dieser Ansatz schlägt jedoch beim Kompilieren fehl, da der Operator „ “ nicht direkt auf den Typ „T“ angewendet werden kann. Um dieses Problem zu lösen, benötigen wir eine Einschränkung, um anzugeben, dass „T“ ein Typ ist, der arithmetische Operationen unterstützt. Leider gibt es in C# keine solche Einschränkung.
Als Alternative können wir die IConvertible
-Schnittstelle als Einschränkung verwenden und „T“ manuell in einen Typ konvertieren, der für die Ausführung arithmetischer Operationen geeignet ist:
<code class="language-csharp">public static T operator +(T x, T y) where T : IConvertible { var type = typeof(T); if (type == typeof(string) || type == typeof(DateTime)) throw new ArgumentException(string.Format("The type {0} is not supported", type.FullName), "T"); try { return (T)(object)(x.ToDouble(NumberFormatInfo.CurrentInfo) + y.ToDouble(NumberFormatInfo.CurrentInfo)); } catch (Exception ex) { throw new ApplicationException("The operation failed.", ex); } }</code>
Diese Methode nutzt die Schnittstelle IConvertible
, um „T“ in „double“ umzuwandeln, die arithmetische Operation auszuführen und das Ergebnis dann wieder in den Typ „T“ umzuwandeln. Es ist jedoch wichtig zu beachten, dass dieser Ansatz möglicherweise nicht für alle Szenarien geeignet ist und möglicherweise an die spezifischen Anforderungen der Anwendung angepasst werden muss.
Das obige ist der detaillierte Inhalt vonWie können arithmetische Operatoren für generische Klassen in C# mit Unterstützung für arithmetische Operationen überladen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!