Maison > développement back-end > C++ > Comment puis-je surcharger les opérateurs arithmétiques pour les types de nombres génériques en C# ?

Comment puis-je surcharger les opérateurs arithmétiques pour les types de nombres génériques en C# ?

Barbara Streisand
Libérer: 2025-01-11 12:47:42
original
283 Les gens l'ont consulté

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

Surcharge d'opérateur arithmétique de classe générique C#

En C#, en raison des contraintes de type, la surcharge des opérateurs arithmétiques des classes génériques nécessite une attention particulière. Lorsque vous utilisez une définition de classe générique comme celle-ci :

<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>
Copier après la connexion

Nous avons découvert une limitation dans l'utilisation de méthodes directes pour définir des opérateurs arithmétiques :

<code class="language-csharp">public static T operator +(ConstrainedNumber<T> x, ConstrainedNumber<T> y)
{
    return x._value + y._value;
}</code>
Copier après la connexion

Ce code ne parvient pas à être compilé car l'opérateur ' ' ne peut pas être appliqué aux types 'T' et 'T' en raison de la nature générique de 'T'.

Pour résoudre ce problème, nous avons besoin d'une contrainte spécifiquement pour les types numériques avec des opérateurs arithmétiques. Malheureusement, C# ne fournit pas de contraintes « IArithmétiques » spécialisées.

Une alternative est d'utiliser la contrainte 'IConvertible', qui nous permet de gérer les opérations arithmétiques manuellement :

<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>
Copier après la connexion

Ce code vérifie les types non pris en charge tels que « string » et « DateTime », puis convertit « x » et « y » en double, effectue l'opération arithmétique et reconvertit le résultat en « T ».

Bien que cette approche nous permette de surcharger les opérateurs arithmétiques pour les types numériques génériques, il est important de noter qu'elle peut ne pas gérer tous les cas potentiels avec élégance.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal