Heim > Backend-Entwicklung > C++ > Wie können arithmetische Operatoren für generische Klassen in C# mit Unterstützung für arithmetische Operationen überladen werden?

Wie können arithmetische Operatoren für generische Klassen in C# mit Unterstützung für arithmetische Operationen überladen werden?

Susan Sarandon
Freigeben: 2025-01-11 12:51:46
Original
390 Leute haben es durchsucht

How Can Arithmetic Operators Be Overloaded for Generic Classes in C# with Arithmetic Operation Support?

Überladung des arithmetischen Operators der generischen C#-Klasse

Das Definieren arithmetischer Operatoren mithilfe generischer Klassen in C# kann eine Herausforderung sein. Dies gilt insbesondere dann, wenn ein generischer Typ auf einen bestimmten Typ beschränkt ist, der arithmetische Operationen unterstützt. Lassen Sie uns ein konkretes Szenario untersuchen, um diese Herausforderung zu veranschaulichen und eine mögliche Lösung anzubieten.

Betrachten Sie die folgende generische Klassendefinition zur Modellierung eingeschränkter Zahlen:

<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

Diese Klasse stellt eine begrenzte Anzahl dar und unterstützt Gleichheitsvergleiche und natürliche Reihenfolge. Um jedoch arithmetische Operationen an Instanzen dieser Klasse durchzuführen, müssen wir die entsprechenden Operatoren definieren.

Eine Möglichkeit besteht darin, einen Operator wie diesen zu definieren:

<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 Ansatz schlägt jedoch beim Kompilieren fehl, da der Operator „ “ nicht direkt auf den Typ „T“ angewendet werden kann. Um dieses Problem zu lösen, benötigen wir eine Einschränkung, um anzugeben, dass „T“ ein Typ ist, der arithmetische Operationen unterstützt. Leider gibt es in C# keine solche Einschränkung.

Als Alternative können wir die IConvertible-Schnittstelle als Einschränkung verwenden und „T“ manuell in einen Typ konvertieren, der für die Ausführung arithmetischer Operationen geeignet ist:

<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

Diese Methode nutzt die Schnittstelle IConvertible, um „T“ in „double“ umzuwandeln, die arithmetische Operation auszuführen und das Ergebnis dann wieder in den Typ „T“ umzuwandeln. Es ist jedoch wichtig zu beachten, dass dieser Ansatz möglicherweise nicht für alle Szenarien geeignet ist und möglicherweise an die spezifischen Anforderungen der Anwendung angepasst werden muss.

Das obige ist der detaillierte Inhalt vonWie können arithmetische Operatoren für generische Klassen in C# mit Unterstützung für arithmetische Operationen überladen werden?. 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