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

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

Barbara Streisand
Freigeben: 2025-01-11 12:36:42
Original
559 Leute haben es durchsucht

How Can I Overload Arithmetic Operators for Generic Numerical Classes in C#?

Ü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:

public class ConstrainedNumber<T> :
    IEquatable<ConstrainedNumber<T>>,
    IEquatable<T>,
    IComparable<ConstrainedNumber<T>>,
    IComparable<T>,
    IComparable
    where T : struct, IComparable, IComparable<T>, IEquatable<T>
Nach dem Login kopieren

Wie definieren wir arithmetische Operatoren für diese Klasse?

Fehlgeschlagener Versuch:

public static T operator +(ConstrainedNumber<T> x, ConstrainedNumber<T> y)
{
    return x._value + y._value;
}
Nach dem Login kopieren

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:

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

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!

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