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
Barbara StreisandOriginal
2025-01-11 12:36:42490Durchsuche

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:

<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!

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