gpt4 book ai didi

c# - 无法从 Func 转换为 Func

转载 作者:行者123 更新时间:2023-11-30 18:56:56 27 4
gpt4 key购买 nike

我对这个错误很困惑:

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>'

关于c# - 无法从 Func<T,T,T> 转换为 Func<T,T,T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15055900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com