以编程方式指定运算符

发布于 2024-11-06 04:52:05 字数 206 浏览 0 评论 0原文

是否可以指定一个运算符 R,其中 R 可以是算术运算符、关系运算符或逻辑运算符?

例如,一个计算

c = a R b

我可以在哪里指定 R 是否为 +、-、*、/

的函数可以在 C# 中完成吗?

Is it possible to specify an operator R where R can be an arithmetic, relational or logical operator ?

For example a function that calculates

c = a R b

where I can specify whether R is +, -, *, /

Can this be done in C# ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

小苏打饼 2024-11-13 04:52:05

二元运算符是任何接受两个操作数的函数。使用委托来抽象此功能很简单a>,基本上是方法(函数)的包装器。

为了使这一点更清楚,我们可以定义一个泛型方法,它只使用指定的参数调用委托并返回其结果:

public Tout GetResult<TIn, TOut>(TIn a, TIn b, Func<TIn, TIn, TOut> @operator)
{
     return @operator(a, b);
}

并且您可以使用它来传递参数和运算符的任意组合:

private bool AreEqual(int a, int b)
{
     return a.Equals(b);
}

private int Subtract(int a, int b)
{
     return a - b;
}

然后您可以使用相同的泛型方法执行您想要的任何操作:

// use the "AreEqual" operator
bool equal = GetResult(10, 10, AreEqual);

// use the "Subtract" operator
int difference = GetResult(10, 10, Subtract);

使用 lambda 表达式,您甚至可以通过将其指定为匿名方法来“动态”创建运算符:

// define a "Product" operator as an anonymous method
int product = GetResult(10, 10, (a,b) => a*b);

A binary operator is any function which accepts two operands. It is simple to abstract this functionality using delegates, which are basically wrappers around methods (functions).

To make this clearer, we can define a generic method which does nothing more that invoke the delegate using specified parameters, and return its result:

public Tout GetResult<TIn, TOut>(TIn a, TIn b, Func<TIn, TIn, TOut> @operator)
{
     return @operator(a, b);
}

And you could use it to pass any combination of parameters and operators:

private bool AreEqual(int a, int b)
{
     return a.Equals(b);
}

private int Subtract(int a, int b)
{
     return a - b;
}

You can then use the same generic method to do whatever operation you want:

// use the "AreEqual" operator
bool equal = GetResult(10, 10, AreEqual);

// use the "Subtract" operator
int difference = GetResult(10, 10, Subtract);

Using lambda expressions, you can even create the operator "on the fly", by specifying it as an anonymous method:

// define a "Product" operator as an anonymous method
int product = GetResult(10, 10, (a,b) => a*b);
不甘平庸 2024-11-13 04:52:05

您可以使用 lambda 做一些非常接近的事情:

Func<int, int, int> op = (x, y) => x + y; // or any other operator

然后像任何其他委托一样使用它:

int result = op(1, 2);

如果有问题的类型是用户使用重载运算符定义的,您可以使用反射,但恐怕对于像 < 这样的类型是不可能的代码>int。

You can do something very close to that using lambda:

Func<int, int, int> op = (x, y) => x + y; // or any other operator

And then use it like any other delegate:

int result = op(1, 2);

If the type in question were user-defined with overloaded operators, you could use reflection, but I'm afraid it's not possible for types like int.

东京女 2024-11-13 04:52:05

C# 中可能存在运算符重载,请检查一些 MSDN

http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx

It is possible to have operator overloading in C#, check some MSDN

http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文