我正在编写一个暴露给VB.Net的C#类。我想重载vb.net ^
运算符,以便我可以写:
Dim c as MyClass
Set c = New ...
Dim d as MyClass
Set d = c^2
在C#中,^
运算符是xor
运算符,幂运算符不存在。有没有办法可以做到这一点?
答案 0 :(得分:10)
修改强>
事实证明,SpecialNameAttribute
允许你声明"特殊" C#中的函数将允许您(以及其他)使VB电源运算符过载:
public class ExponentClass
{
public double Value { get; set; }
[System.Runtime.CompilerServices.SpecialName]
public static ExponentClass op_Exponent(ExponentClass o1, ExponentClass o2)
{
return new ExponentClass { Value = Math.Pow(o1.Value, o2.Value) };
}
}
上述类中的op_Exponent
函数由VB转换为^
幂运算符。
有趣的是,documentation表示.NET框架当前未使用的属性...
- 原始答案 -
没有。权力(^
)运算符被编译为Math.Pow()
,因此无法超载"它在C#中。
来自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
答案 1 :(得分:2)
通过实验,结果表明运算符重载只是语法糖,如果你需要用多种语言开发,最好避免使用。例如,VB.NET的^
运算符被转换为op_Exponent
函数,因此这是C#中可用的。
Why doesn't C# have a power operator?
您可以使用本机.NET方式,因此您不依赖于运算符:
Math.Pow(x, y);
同样,对于y = 2,使用乘法(x * x)会更快。