簡體   English   中英

無法從Func轉換 <T,T,T> 到Func <T,T,T>

[英]Cannot convert from Func<T,T,T> to Func<T,T,T>

我對這個錯誤很困惑:

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);
    }
}

問題是你的方法是通用的,引入了一個新的類型參數T 所以T方法以外是不一樣的T的方法內。

只需將您的方法更改為不通用:

public static T Add(T a, T b)

......它應該沒問題。

為了更清楚,您的代碼目前等效於此:

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);
    }
}

請注意我是如何改名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>'

T你的Operators<T>類和T的類型參數Add有不同的類型,所以沒有保證的類型兼容。

例如,您可以這樣做:

Operators<string>.Add<int>(1, 2);

編譯器會發出此效果的警告:

類型參數'T'與外部類型'Operators'中的type參數同名

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM