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!