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 フレームワークで現在使用されていない属性が記載されています...
-- 元の回答 --
いいえ。べき乗 ( ^
) 演算子はコンパイルされる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
実験によると、演算子のオーバーロードは単なる構文糖衣であり、複数の言語で開発する必要がある場合は避けたほうがよいことがわかりました。たとえば、^
VB.NET の演算子は関数に変換されるop_Exponent
ため、これが C# から利用できるものです。
演算子に依存しないように、ネイティブの .NET の方法を使用できます。
Math.Pow(x, y);
また、y=2 の場合、乗算 (x*x) を使用する方が高速です。