我写暴露于VB.Net C#类。 我想超载vb.net ^
运营商,这样我可以这样写:
Dim c as MyClass
Set c = New ...
Dim d as MyClass
Set d = c^2
在C#中, ^
运算符是xor
运算符和电力运营商不存在。 有没有一种方法可以让我反正这样做呢?
我写暴露于VB.Net C#类。 我想超载vb.net ^
运营商,这样我可以这样写:
Dim c as MyClass
Set c = New ...
Dim d as MyClass
Set d = c^2
在C#中, ^
运算符是xor
运算符和电力运营商不存在。 有没有一种方法可以让我反正这样做呢?
编辑
原来有一个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到翻译^
电力运营商。
有趣的是,该文件指出在当前未使用的.NET框架的属性...
--ORIGINAL答案 -
号的功率( ^
)运算符被编译为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
通过实验,事实证明,操作符重载只是语法糖,更好是可以避免的,如果您需要在多语言开发。 例如, ^
VB.NET的操作被转换为op_Exponent
功能,所以这是提供给您从C#。
为什么不C#有电运营商?
您可以使用本机.NET的方式让你不依赖于运营商:
Math.Pow(x, y);
还对于y = 2是更快地使用乘法(X * X)。