Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# operators as functions

Is there a way to use operators as functions without declaring them manually?

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

Similar to (+)/(-) in Haskell. Would be handy in various LINQ scenarios involving conditional query construction. Maybe some C# (4.0+) trick I don't know about.

Edit: here is a sample to clarify what I mean:

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

a usual call would be:

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

a cool call would be (assuming Haskell style):

MyWhere((&&))
like image 411
UserControl Avatar asked Dec 01 '11 14:12

UserControl


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is C in C language?

What is C? C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.

Is C language easy?

Compared to other languages—like Java, PHP, or C#—C is a relatively simple language to learn for anyone just starting to learn computer programming because of its limited number of keywords.


2 Answers

No.

You can find the definitions (F12 in VS) for the operators you can overload, and there exists a

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

But there is no way to call Double.operator==(a, b).

The Framework does offer a a.Equals(b) for this particualr case, but there is no a.Add(b).

like image 50
Henk Holterman Avatar answered Oct 27 '22 00:10

Henk Holterman


For documentary purposes: user-defined operator are functions, however the C# language explicitly prohibits explicit calls (don't know the rationale). 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
    }
}

If you were writing IL, you'd write this:

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 
like image 30
sehe Avatar answered Oct 27 '22 00:10

sehe