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

JF *_*ier 16 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]));
}
Run Code Online (Sandbox Code Playgroud)

然后我试了一下

DualElement<double> dubidu = (i, j) => cost[i, j];
Run Code Online (Sandbox Code Playgroud)

它给出了"无法转换lambda表达式...因为它不是委托类型"

相反,有效的是:

DualElement<double> dideldu = (Func<OPTatom, OPTatom, double>)((i, j) => cost[i, j]);
Run Code Online (Sandbox Code Playgroud)

我猜,lambda表达式没有'Func'类型,所以我必须在隐式转换中加入不同的东西.

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

Dmi*_*try 6

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

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

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

var func = (i, j) => i + j;
Run Code Online (Sandbox Code Playgroud)