Heim >Backend-Entwicklung >C++ >Wie kann ich arithmetische Operatoren für generische numerische Klassen in C# überladen?
Überladung des generischen numerischen Arithmetikoperators in C#
In C# kann die Definition arithmetischer Operatoren für generische Klassen eine Herausforderung sein, insbesondere wenn es um eingeschränkte numerische Typen geht. Schauen wir uns einen konkreten Fall an:
Problemstellung:
Angenommen eine generische Klassendefinition:
<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>
Wie definieren wir arithmetische Operatoren für diese Klasse?
Fehlgeschlagener Versuch:
<code class="language-csharp">public static T operator +(ConstrainedNumber<T> x, ConstrainedNumber<T> y) { return x._value + y._value; }</code>
Dieser Code lässt sich nicht kompilieren, da der Operator „ “ nicht auf die Typen „T“ und „T“ angewendet werden kann.
Einschränkungen für arithmetische Operatoren:
Um dieses Problem zu lösen, benötigen wir eine Einschränkung für einen numerischen Typ, der arithmetische Operatoren unterstützt. C# stellt solche Einschränkungen jedoch nicht explizit bereit.
Lösung mit IConvertible:
Alternativ können wir die IConvertible
-Schnittstelle als Einschränkung verwenden und Operationen mit ihren Methoden ausführen. Hier ist ein Beispiel:
<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)Convert.ChangeType(x.ToDouble(NumberFormatInfo.CurrentInfo) + y.ToDouble(NumberFormatInfo.CurrentInfo), type); } catch (Exception ex) { throw new ApplicationException("The operation failed.", ex); } }</code>
Diese Lösung nutzt die IConvertible
-Schnittstelle, um den Wert in double umzuwandeln, die Operation auszuführen und das Ergebnis wieder in den ursprünglichen Typ umzuwandeln. Für eine zuverlässigere Typkonvertierung wird hier die Methode Convert.ChangeType
verwendet.
Obwohl diese Methode an eine größere Auswahl an Typen angepasst werden kann, ist es wichtig zu beachten, dass sie nicht narrensicher ist und möglicherweise eine Ausnahme auslöst, wenn der Vorgang für den angegebenen Typ nicht unterstützt wird.
Das obige ist der detaillierte Inhalt vonWie kann ich arithmetische Operatoren für generische numerische Klassen in C# überladen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!