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

C# 从lambda表达式到用户定义类型的隐式转换,c#,lambda,implicit-conversion,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])); } public静态隐式运算符DualElement(Func-atomMap) { 返回新的

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

public static implicit operator DualElement<T>(Func<OPTatom, OPTatom, T> atomMap)
{
    return new DualElement<T>(e => atomMap(e[0],e[1]));
}
public静态隐式运算符DualElement(Func-atomMap)
{
返回新的DualElement(e=>atomMap(e[0],e[1]);
}
然后我试着

DualElement<double> dubidu = (i, j) => cost[i, j];
双元素dubidu=(i,j)=>成本[i,j];
它给出“无法转换lambda表达式…因为它不是委托类型”

相反,有效的方法是:

DualElement<double> dideldu = (Func<OPTatom, OPTatom, double>)((i, j) => cost[i, j]);
dualelementdideldu=(Func)((i,j)=>成本[i,j]);
我想,lambda表达式没有“Func”类型,因此我必须在隐式转换中加入不同的内容


有人能给我一个提示吗?

你的解决方法很好。
lambda本身没有类型,因此应该铸造成适当的类型。
请参阅:

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

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

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

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

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

Func<OPTatom, OPTatom, T> temp = (i, j) => cost[i, j];
DualElement<double> dubidu = temp;
Func temp=(i,j)=>成本[i,j];
双元素dubidu=温度;
我创建了演示,效果很好

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"));
    }
}
公共类程序
{
公共静态void Main()
{
Func Func=d=>true;
过程p=func;
//进程p=d=>true;将导致错误
}
}
公共类过程
{
公共程序(T项)
{
项目=项目;
}
公共交通项目
{
得到;
设置
}
公共静态隐式运算符进程(Func Func)
{
返回新流程(func(“jenish”);
}
}

是dotnetfiddle link,以防你想玩它。

DualElement的定义是什么?@Sajjad:我有不同的lambda表达式,它们的“意思”从OPTelement类型的元素到T类型的函数。我的目标是隐式地将它们转换为相同的类型,这样我就不必根据DualElement的来源重载每个方法。@JenishRabadiya我想OP是在尝试将lambda分配给
DualElement
。但是lambda没有类型。因此,初步将lambda转换为
Func
会有所帮助。我的示例不会编译,你自己试试。@JenishRabadiya实际上OP希望通过使用隐式运算符实例化
双元素
,就像在Linq to XML中可以使用
XName foo=“bar”
。这是否意味着在C#中不可能从lambda表达式隐式转换为其他类型?@JFMeier否,这在C#中是可能的,但在cast操作符重载中是不可能的,因为编译器无法确定正确的lambda类型。假设对于具有相同签名的两种不同委托类型有两个不同的强制转换运算符。Lambda可以强制转换为这些委托类型中的任何一种。用哪一个?谢谢。但我最初的目标是使用不同的lambda表达式作为方法的参数。目前,我为每个使用DualElement的方法编写了四个重载方法,因为我希望这些方法有一个简单的使用方法(根据lambda表达式)。我试图避免这种翻两番,但显然,这是不可能的。