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