我想定义从(特定)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;所以我必须在隐式转换中加入不同的东西。
有人可以给我一个提示吗?
答案 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链接,以防你想玩它。