VB.Net功率运算符(^)从C#超载(VB.Net Power operator (^) over

2019-07-03 15:29发布

我写暴露于VB.Net C#类。 我想超载vb.net ^运营商,这样我可以这样写:

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

在C#中, ^运算符是xor运算符和电力运营商不存在。 有没有一种方法可以让我反正这样做呢?

Answer 1:

编辑

原来有一个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


Answer 2:

通过实验,事实证明,操作符重载只是语法糖,更好是可以避免的,如果您需要在多语言开发。 例如, ^ VB.NET的操作被转换为op_Exponent功能,所以这是提供给您从C#。

为什么不C#有电运营商?

您可以使用本机.NET的方式让你不依赖于运营商:

Math.Pow(x, y);

还对于y = 2是更快地使用乘法(X * X)。



文章来源: VB.Net Power operator (^) overloading from C#