[英]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.