C# CS1503错误:Select无法推断类型,System.Func与Func类型混淆问题
问题原因
你遇到的错误本质是当前项目环境中存在非System命名空间下的自定义Func<>委托定义,和.NET 基础类库自带的System.Func<>重名:
- C# 类型推断时,默认将你代码中写的
Func<Foo, Foo>绑定到了自定义的委托类型 - 而
System.Linq的Select方法预期返回的是System.Func<>类型,两种委托虽然签名完全一致,但属于不同的类型,因此触发类型转换错误
修复方案
方案1:删除自定义Func委托(最推荐)
直接搜索你当前项目、依赖项目中是否存在自定义的Func<>委托定义,格式一般为:
// 类似这种自定义的重复委托定义 public delegate TResult Func<in T, out TResult>(T arg);
.NET 自带的System.Func<>已经完全满足需求,删除自定义定义后,类型推断会自动绑定到System.Func<>,无需额外修改代码即可正常运行。
方案2:添加命名空间别名
如果自定义Func<>来自无法修改的第三方依赖,可以在报错文件的头部添加using别名,强制当前文件下的Func<>指向系统定义:
// 文件头部添加,有几个泛型重载就加几个对应的别名 using Func<T, TResult> = System.Func<T, TResult>; // 如果用到更多参数的Func可以继续加 using Func<T1, T2, TResult> = System.Func<T1, T2, TResult>;
如果你的项目是C# 10+ 支持全局using,可以把上述别名放到GlobalUsings.cs中,全局生效无需每个文件重复添加。
方案3:Lambda显式类型转换
如果只想修改单条报错语句,可以在Lambda表达式前显式指定为System.Func<>,即可让Select正确推断类型:
BarCollection.Select(b => (System.Func<Foo, Foo>)(f => f.ExtendedBy(b)))
内容的提问来源于stack exchange,提问作者Frank Schwieterman
相关产品推荐
相关产品推荐

