Überladung des arithmetischen Operators der generischen C#-Klasse
In C# erfordert die Überladung generischer Klassen durch arithmetische Operatoren aufgrund von Typbeschränkungen besondere Beachtung. Bei Verwendung einer generischen Klassendefinition wie dieser:
<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>
Wir haben eine Einschränkung bei der Verwendung direkter Methoden zum Definieren arithmetischer Operatoren entdeckt:
<code class="language-csharp">public static T operator +(ConstrainedNumber<T> x, ConstrainedNumber<T> y) { return x._value + y._value; }</code>
Dieser Code kann nicht kompiliert werden, da der Operator „ “ aufgrund der generischen Natur von „T“ nicht auf die Typen „T“ und „T“ angewendet werden kann.
Um dieses Problem zu lösen, benötigen wir eine Einschränkung speziell für numerische Typen mit arithmetischen Operatoren. Leider bietet C# keine speziellen „IArithmetic“-Einschränkungen.
Eine Alternative besteht darin, die Einschränkung „IConvertible“ zu verwenden, die es uns ermöglicht, die arithmetischen Operationen manuell durchzuführen:
<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>
Dieser Code sucht nach nicht unterstützten Typen wie „string“ und „DateTime“, wandelt dann „x“ und „y“ in „double“ um, führt die arithmetische Operation aus und wandelt das Ergebnis zurück in „T“.
Während dieser Ansatz es uns ermöglicht, arithmetische Operatoren für generische numerische Typen zu überladen, ist es wichtig zu beachten, dass er möglicherweise nicht alle potenziellen Fälle ordnungsgemäß behandelt.
Das obige ist der detaillierte Inhalt vonWie kann ich arithmetische Operatoren für generische Zahlentypen in C# überladen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!