无法从Func <T,T,T>转换为Func <T,T,T>

mpe*_*pen 2 c# generics delegates casting

我对这个错误很困惑:

Cannot implicitly convert type 'System.Func<T,T,T> [c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll]' to 'System.Func<T,T,T> [c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll]' path\to\my\project\Operators.cs

类型是相同的,为什么它甚至试图进行演员表演?这是代码:

public static class Operators<T>
{
    private static Func<T,T,T> _add = null;

    public static T Add<T>(T a, T b)
    {
        if (_add == null) {
            var param1Expr = Expression.Parameter(typeof (T));
            var param2Expr = Expression.Parameter(typeof (T));
            var addExpr = Expression.Add(param1Expr, param2Expr);
            var expr = Expression.Lambda<Func<T, T, T>>(addExpr, param1Expr, param2Expr);
            _add = expr.Compile(); // <--- error occurs here
        }
        return _add.Invoke(a, b);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 13

问题是你的方法是通用的,引入了一个新的类型参数T.所以T方法的外部与方法内部不一样T.

只需将您的方法更改为不通用:

public static T Add(T a, T b)
Run Code Online (Sandbox Code Playgroud)

......它应该没问题.

为了更清楚,您的代码目前等效于此:

public static class Operators<TC>
{
    private static Func<TC, TC, TC> _add = null;

    public static TM Add<TM>(TM a, TM b)
    {
        if (_add == null) {
            var param1Expr = Expression.Parameter(typeof(TM));
            var param2Expr = Expression.Parameter(typeof(TM));
            var addExpr = Expression.Add(param1Expr, param2Expr);
            var expr = Expression.Lambda<Func<TM, TM, TM>>
                          (addExpr, param1Expr, param2Expr);
            _add = expr.Compile();
        }
        return _add.Invoke(a, b);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意我是如何改名为T通过引入的TC,并T通过引入的方法TM.现在,错误消息看起来更合理:

Test.cs(19,20): error CS0029: Cannot implicitly convert type
        'System.Func<TM,TM,TM>' to 'System.Func<TC,TC,TC>'
Run Code Online (Sandbox Code Playgroud)