c# - 隐式运算符和 lambda

标签 c# lambda delegates expression implicit-conversion

我正在尝试创建一个接受 lambda 并将其存储在内部的类。语法类似于:

class Lambda<TIn, TOut> {
    private Expression<Func<TIn, TOut>> expr;
    private Func<TIn, TOut>> func;

    public Lambda(Expression<Func<TIn, TOut>> e) {
        expr = e;
    }

    public Lambda(Func<TIn, TOut> f) {
        func = f;
    }

    public static implicit operator Lambda<TIn, TOut>([lambdatype] o) {
        return new Lambda(o);
    }
}

用法:

Lambda<TIn, TOut> l = o => ... ;

但是我在弄清楚细节时遇到了一些麻烦。我知道 lambda 是匿名类型,直到它被分配给表达式或委托(delegate),并且我(我相信)必须使用隐式运算符来获取我想要的语法,但除此之外我已经命中一堵墙。如果它们已经被分配给一个变量,我可以在我的隐式运算符中使用 Expression 或 Func:

Expression<Func<T1, T2>> e = o => ...;
Func<T1, T2> f = o => ...;

Lambda<T1, T2> l1 = e, l2 = f;

但我更愿意只分配 lambda 本身并让类(class)弄清楚细节。

最佳答案

您的问题是 C# 语言 does not chain user-defined implicit conversions .

Lambda 表达式是无类型表达式,可以隐式转换为(可能是无限的)一组兼容的委托(delegate)和表达式树类型。 (参见规范的 §6.5)

您不能同时调用从委托(delegate)类型到您自己的类型的隐式转换和用户定义的隐式转换。

相反,您可以显式创建类型化委托(delegate):

Lambda<TIn, TOut> l = new Func<TIn, TOUt>(o => ... );

您还可以要求 C# 语言团队为用户定义的从方法组或 lambda 到任何类型的隐式转换定义语法。

关于c# - 隐式运算符和 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21862650/

相关文章:

iphone - 选项卡栏 Controller ( Storyboard模板)和 AppDelegate

C++11 lambda 实现和内存模型

ios - 从 UIPopoverController 显示时,不会调用 UITableView 的自定义委托(delegate)

c# - 从 php 页面获取响应

c# - 基于Datatable在Data grid View中标记复选框

c# - 将数据添加到结构体数组中

c# - 动态 ascx 用户控件的空引用异常

c++ - lambda 中的递归调用 (C++11)

java - 在 Java 中实现递归 lambda 函数

ios - 将数据从子 VC 传递回 Collection View Cell