2

我试图编写一个具有 LINQ 查询的方法。

所以这个方法:

DoSomething(Operator operator, string name)
{
  // if operator is ==
  // use == as comparison
  // if operator is !=
  // use != as comparison

  // pseudo query
  var result = from rec in collection
               where rec.name operator name
               select rec;
 }

我知道这可以使用委托和 Func 和 Action 来完成,这里的解释非常优雅。

但我想知道的是为什么一个方法只需要一个类型?为什么 CLR 不允许将运算符作为参数传递给方法?设计背后的想法是什么?

4

2 回答 2

1

CLR 与此无关。运算符仅存在于语言级别,并且在编译为 IL 时归结为静态方法(可能带有一些标志)。这些静态方法使用标准名称,例如op_Addition,但这只是为了简化支持运算符重载的语言之间的兼容性。例如,实现的静态方法operator ==完全可以作为Func<T, T, bool>.

至于为什么 C# 明确不允许将运算符解释为方法组并转换为匹配的委托类型,我可以看到几个原因。首先,这更像是一种函数式编程,而 C# 的设计是为了保持熟悉的 OOP/Java-ish 类型的结构(尽管从那时起他们已经对此进行了扩展)。其次,语法是什么?DoSomething(==, "foo")可能会在语法中产生很多歧义,并且 C++ishDoSomething(operator==, "foo")开始变得非常复杂。最后,这可能是 C# 程序员不会经常使用甚至不知道的东西,请记住所有功能都从 -100 点开始

于 2013-06-11T05:01:36.267 回答
0

我想说的很简单,因为这不是操作员的处理方式。考虑这样一个类:

public class A
{
    public int Prop { get; set; }
}

现在考虑这段代码:

var a1 = new A() { Prop = 1 };
var a2 = new A() { Prop = 2 };

目前我需要这样做:

if (a1.Prop == a2.Prop)

这会起作用,但如果我能做到这一点怎么办:

if (a1 == a2)

这确实意味着上述内容。这就是运营商所做的。这就是为什么您不能将它们作为参数传递的原因。事实上,我刚刚展示的代码比您提供的更简洁。为什么不像这样重载运算符:

public static bool operator ==(A a1, A a2)
{
    return a1.Prop == a2.Prop;
}

或者在您的情况下,在重载中运行适当的查询。就那么简单!

于 2013-06-11T05:00:49.467 回答