我对这个错误感到很困惑:
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);
}
}
答案 0 :(得分:13)
问题是您的方法是通用的,引入了新的类型参数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>'
答案 1 :(得分:2)
T
类的Operators<T>
和T
的{{1}}类型参数是不同的类型,因此无法保证类型兼容。
例如你可以这样做:
Add
编译器会发出警告:
类型参数“T”与外部的类型参数同名 输入'运营商'