8

VB.Net に公開される C# クラスを作成しています。^次のように書けるように、vb.net演算子をオーバーロードしたいと思います。

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

C# では、^演算子はxor演算子であり、ベキ演算子は存在しません。とにかくこれを行う方法はありますか?

4

2 に答える 2

12

編集

SpecialNameAttributeC# で「特別な」関数を宣言できる があり、(特に) 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 フレームワークで現在使用されていない属性が記載されています...

-- 元の回答 --

いいえ。べき乗 ( ^) 演算子はコンパイルされる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_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
于 2012-11-06T20:58:46.003 に答える
2

実験によると、演算子のオーバーロードは単なる構文糖衣であり、複数の言語で開発する必要がある場合は避けたほうがよいことがわかりました。たとえば、^VB.NET の演算子は関数に変換されるop_Exponentため、これが C# から利用できるものです。

C# にべき乗演算子がないのはなぜですか?

演算子に依存しないように、ネイティブの .NET の方法を使用できます。

Math.Pow(x, y);

また、y=2 の場合、乗算 (x*x) を使用する方が高速です。

于 2012-11-06T20:54:25.823 に答える