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
Barbara Streisandoriginal
2025-01-11 12:36:42537parcourir

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>

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>

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>

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!

Déclaration:
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