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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-11 12:57:42288parcourir

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

Surcharge d'opérateurs arithmétiques dans les classes génériques restreintes C#

En C#, définir des opérateurs arithmétiques pour des classes génériques avec des contraintes peut poser des défis. Considérez la définition de classe générique suivante :

<code class="language-csharp">public class ConstrainedNumber<T></code>

Parmi eux, des contraintes comme IComparable et IEquatable sont imposées aux types numériques primitifs comme int et float.

Puisque T lui-même n'a pas d'opérateurs arithmétiques inhérents, l'utilisation de la syntaxe public static T operator (ConstrainedNumber<T> x, ConstrainedNumber<T> y) pour définir des opérateurs arithmétiques pour cette classe échouera.

Solution utilisant IConvertible

Une solution consiste à utiliser IConvertible comme contrainte. Cette interface prend en charge la conversion de type automatique, permettant des opérations sur différents types primitifs. Cependant, il est important de noter que certains types, tels que String et DateTime, ne prennent pas en charge les opérateurs arithmétiques et nécessitent une vérification manuelle ou des restrictions lors de l'implémentation.

Ce qui suit est un exemple de surcharge d'opérateur à l'aide d'IConvertible :

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

En utilisant IConvertible, nous pouvons effectuer des opérations arithmétiques sur une variété de types numériques primitifs tout en gérant avec élégance les types non pris en charge. Cela fournit une solution pour ajouter des opérateurs arithmétiques aux classes génériques avec des contraintes en C#.

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