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

Comment puis-je surcharger les opérateurs arithmétiques pour les classes numériques génériques en C# ?

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

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

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

En C#, définir des opérateurs arithmétiques pour les classes génériques peut s'avérer difficile, en particulier lorsqu'il s'agit de types numériques contraints. Etudions un cas précis :

Énoncé du problème :

Étant donné une définition de classe générique :

<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

Comment définir les opérateurs arithmétiques pour cette classe ?

Tentative échouée :

<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 se compile pas car l'opérateur ' " ne peut pas être appliqué aux types 'T' et 'T'.

Contraintes sur les opérateurs arithmétiques :

Pour résoudre ce problème, nous avons besoin d'une contrainte sur un type numérique qui supporte les opérateurs arithmétiques. Cependant, C# ne fournit pas explicitement de telles contraintes.

Solution utilisant IConvertible :

Comme alternative, nous pouvons utiliser l'interface IConvertible comme contrainte et effectuer des opérations en utilisant ses méthodes. Voici un exemple :

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

Cette solution utilise l'interface IConvertible pour convertir la valeur en double, effectuer l'opération et reconvertir le résultat au type d'origine. La méthode Convert.ChangeType est utilisée ici pour une conversion de type plus fiable.

Bien que cette méthode puisse être adaptée à un plus large éventail de types, il est important de noter qu'elle n'est pas infaillible et peut lever une exception si l'opération n'est pas prise en charge pour le type spécifié.

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