C#覆盖〜取一个函数

时间:2014-02-27 19:49:02

标签: c# operators overloading

理想情况下,我想要实现类似var queryResult = ~( () => function(arg) );

的内容

我写了一个自动化框架,我厌倦了为它编写长行代码。它使用查询来搜索UI和其他数据源。所以我想,由于这个项目与源代码是分开的,我可以通过操作员来解决问题。下面的编译很好,但我收到一个错误:

无法将运算符'〜'应用于lambda表达式类型的操作数

public struct Query<T>
{
    public static Query<T> operator ~(Query<T> func)
    {
        return Poll.IdleFor(() => func, 10000);
    }
}

在正在运行的代码的另一部分中,我有一个像这样的方法签名:

static T IdleFor<T>(Func<T> arg, long waitTimeInMilliseconds)<T>(Func<T> arg, long milliseconds)

我通过MyStaticClass.IdleFor( () => myFunction(val), 10000)

来称呼它

我在这里缺少什么?

1 个答案:

答案 0 :(得分:6)

  

我可以通过操作员来解决问题。

在C#中,这是一种非常非常糟糕的态度。 “使用运算符进行操作”来制作除数学语义之外的语义在C#中是一种不好的做法,我强烈反对你试图这样做。

我注意到你没有问一个可回答的问题。 “我错过了什么?”这个问题不够具体。那么让我们提出一些可回答的问题:

  

是否可以在C#中重载一元运算符,使得该运算符的操作数可以是lambda表达式?

没有

  

如何在C#中解决重载的一元运算符?

首先确定操作数的类型。从这种类型中,创建了一个重载运算符列表。然后,重载分辨率或多或少地与方法重载决策一样,将操作数视为参数,将操作符视为方法。

  

那么为什么这不适用于lambdas?

我说首先确定了操作数的类型。 Lambdas没有类型。因此,没有重载运算符列表,首先要执行重载解析。