Операторы C # как функции - PullRequest
8 голосов
/ 01 декабря 2011

Есть ли способ использовать операторы как функции, не объявляя их вручную?

Func<bool, bool> not = x => !x;

Аналогично (+) / (-) в Haskell. Было бы удобно в различных сценариях LINQ, связанных с построением условных запросов. Может быть, какой-то трюк с C # (4.0+), о котором я не знаю.

Редактировать: Вот пример, чтобы уточнить, что я имею в виду:

 int MyWhere(Func<bool, bool, bool> cond) {}

обычный вызов будет:

MyWhere((x,y) => x && y)

крутой колл (в стиле Haskell):

MyWhere((&&))

Ответы [ 3 ]

6 голосов
/ 01 декабря 2011

Нет.

Вы можете найти определения (F12 в VS) для операторов, которые вы можете перегрузить, и существует

 // struct Double
 public static bool operator ==(double left, double right);

Но нет возможности позвонить Double.operator==(a, b).

Framework предлагает a.Equals(b) для этого конкретного случая, но нет a.Add(b).

3 голосов
/ 01 декабря 2011

Для документальных целей: определяемые пользователем операторы являются функциями, однако язык C # явно запрещает явные вызовы (не знаю обоснования). E.g.:

public class X
{
    public static X operator+(X a, X b)
    {
        return new X();
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        var q = new X() + new X();
        X.op_Addition(q,q); // error CS0571: 
        //   `Program.X.operator +(Program.X, Program.X)': cannot explicitly
        //   call operator or accessor
    }
}

Если бы вы писали IL, вы бы написали:

newobj instance void class X::'.ctor'()
newobj instance void class X::'.ctor'()
call class X class X::op_Addition(class X, class X)
stloc.0 
1 голос
/ 01 декабря 2011

Если я понимаю, что вы хотите сделать правильно, вы можете использовать System.Reflection и Delegate.CreateDelegate для создания делегата для метода оператора.

Конечно, я никогда не проверял это, но методы оператора методов так что должно работать.Это также может быть автоматизировано (для экономии времени по сравнению с прямым методом).

См .:

http://msdn.microsoft.com/de-de/library/53cz7sc6.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...