Перегрузка оператора VB.Net Power (^) из C#
Я пишу класс C#, который доступен для VB.Net. Я хотел бы перегрузить vb.net ^
оператор, чтобы я мог написать:
Dim c as MyClass
Set c = New ...
Dim d as MyClass
Set d = c^2
В C# ^
оператор является xor
оператор и оператор власти не существует. Есть ли способ, которым я могу это сделать?
2 ответа
РЕДАКТИРОВАТЬ
Оказывается, есть 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 Framework...
--ОРИГИНАЛЬНЫЙ ОТВЕТ -
№ сила (^
) оператор компилируется как 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).