Heim > Backend-Entwicklung > C++ > Wie kann ich arithmetische Operatoren für generische Zahlentypen in C# überladen?

Wie kann ich arithmetische Operatoren für generische Zahlentypen in C# überladen?

Barbara Streisand
Freigeben: 2025-01-11 12:47:42
Original
317 Leute haben es durchsucht

How Can I Overload Arithmetic Operators for Generic Number Types in C#?

Ü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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage