VB.Net Power运算符(^)从C#重载

时间:2012-11-06 20:48:38

标签: c# vb.net operator-overloading operator-keyword

我正在编写一个暴露给VB.Net的C#类。我想重载vb.net ^运算符,以便我可以写:

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

在C#中,^运算符是xor运算符,幂运算符不存在。有没有办法可以做到这一点?

2 个答案:

答案 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)会更快。