VB.Net Power Operator (^) en surcharge de C #

J’écris une classe C # qui est exposée à VB.Net. Je voudrais surcharger l’opérateur vb.net ^ pour pouvoir écrire:

 Dim c as MyClass Set c = New ... Dim d as MyClass Set d = c^2 

En C #, l’opérateur ^ est l’opérateur xor et l’opérateur élecsortingque n’existe pas. Est-ce qu’il y a un moyen de faire ça quand même?

MODIFIER

Il s’avère qu’il existe un SpecialNameAtsortingbute qui vous permet de déclarer des fonctions “spéciales” en C # qui vous permettront (entre autres) de surcharger l’opérateur d’alimentation VB:

 public class ExponentClass { public double Value { get; set; } [System.Runtime.ComstackrServices.SpecialName] public static ExponentClass op_Exponent(ExponentClass o1, ExponentClass o2) { return new ExponentClass { Value = Math.Pow(o1.Value, o2.Value) }; } } 

La fonction op_Exponent de la classe ci-dessus est traduite par VB en opérateur ^ power.

Fait intéressant, la documentation indique que l’atsortingbut n’est pas utilisé actuellement par le framework .NET …

– RÉPONSE ORIGINALE –

Non. L’opérateur power ( ^ ) est compilé en tant que Math.Pow() . Il n’y a donc aucun moyen de le “surcharger” en C #.

De LinqPad:

 Sub Main Dim i as Integer Dim j as Integer j = Integer.Parse("6") i = (5^j) i.Dump() End Sub 

IL:

 IL_0001: ldstr "6" IL_0006: call System.Int32.Parse IL_000B: stloc.1 IL_000C: ldc.r8 00 00 00 00 00 00 14 40 IL_0015: ldloc.1 IL_0016: conv.r8 IL_0017: call System.Math.Pow IL_001C: call System.Math.Round IL_0021: conv.ovf.i4 IL_0022: stloc.0 IL_0023: ldloc.0 IL_0024: call LINQPad.Extensions.Dump 

Par expérience, il s’avère que la surcharge des opérateurs n’est qu’un sucre syntaxique, qu’il vaut mieux éviter, si vous avez besoin de développer dans plusieurs langues. Par exemple, l’opérateur ^ de VB.NET est traduit en la fonction op_Exponent . Il s’agit donc de ce que C # a à votre disposition.

Pourquoi C # n’a-t-il pas d’opérateur élecsortingque?

Vous pouvez utiliser une méthode .NET native pour ne pas compter sur les opérateurs:

 Math.Pow(x, y); 

De plus, pour y = 2, il est plus rapide d’utiliser la multiplication (x * x).