从lambda表达式到用户定义类型的隐式转换

时间:2015-04-28 10:25:19

标签: c# lambda implicit-conversion

我想定义从(特定)lambda表达式到用户定义类型的隐式转换。我尝试了以下方法:

public static implicit operator DualElement<T>(Func<OPTatom, OPTatom, T> atomMap)
{
    return new DualElement<T>(e => atomMap(e[0],e[1]));
}

然后我试了

DualElement<double> dubidu = (i, j) => cost[i, j];

赋予&#34;无法转换lambda表达式...因为它不是委托类型&#34;

相反,有效的是:

DualElement<double> dideldu = (Func<OPTatom, OPTatom, double>)((i, j) => cost[i, j]);

我猜,lambda表达式没有&#39; Func&#39;所以我必须在隐式转换中加入不同的东西。

有人可以给我一个提示吗?

2 个答案:

答案 0 :(得分:5)

你的解决方法非常好。
Lambdas本身没有类型,因此它们应该被转换为适当的类型 请参阅MSDN

  

请注意, lambda表达式本身没有类型,因为公共类型系统没有“lambda表达式”的内在概念。然而,有时非常方便地谈论lambda表达式的“类型”。在这些情况下,类型引用lambda表达式转换为的委托类型或表达式类型。

这就是以下示例无法编译的原因:

var func = (i, j) => i + j;

答案 1 :(得分:2)

您已经从Func<OPTatom, OPTatom, T>委托类型定义了隐式运算符,并尝试从lambda表达式转换,这对C#编译器来说似乎很奇怪。

而是将lambda表达式存储在Func<OPTatom, OPTatom, T>类型的某个变量中,然后执行隐式转换。 以下将在这里工作:

Func<OPTatom, OPTatom, T> temp = (i, j) => cost[i, j];
DualElement<double> dubidu = temp;

我创建了demo并且运行正常。

public class Program
{
    public static void Main()
    {
        Func<string, bool> func = d => true;
        Process<bool> p = func;
        //Process<bool> p = d => true; would result in error
    }
}

public class Process<T>
{
    public Process(T item)
    {
        Item = item;
    }

    public T Item
    {
        get;
        set;
    }

    public static implicit operator Process<T>(Func<string, T> func)
    {
        return new Process<T>(func("jenish"));
    }
}

Here是dotnetfiddle链接,以防你想玩它。