.NET 6中能否定义返回类型固定、参数任意的C#委托?
解答:无法直接声明不限参数但固定返回类型的委托
核心结论
在C#(包括.NET 6)中,不存在语法支持直接声明仅固定返回类型、完全不限制输入参数数量/类型的委托类型。C#的委托是强类型结构,必须在声明时明确参数的数量、类型和顺序,没有“任意参数”的模糊定义方式。
为什么你的设想无法实现
- C#委托的声明规则要求必须明确参数列表的结构,你设想的
EvaluationDelegate<T>这种“任意参数”的形式不符合语言规范。 - 你当前使用的
Delegate是所有委托的基类,但它属于弱类型,这也是代码失去编译期类型检查、泛型优势的根本原因。
.NET 6下的可行替代方案
虽然不能直接实现目标委托,但可以通过重载不同参数数量的泛型方法,结合C#的类型推断特性,解决你遇到的调用时的类型推断问题:
1. 为ComplexObject添加多参数重载的Evaluate方法
针对常用的参数数量(比如0到5个),重载Evaluate<T>方法,使用Func<TArg..., TResult>作为参数类型:
public class ComplexObject { public T Evaluate<T>(Func<T> method) { var parameters = DoMagicToGetTheParameterValues(method); var obj = method.DynamicInvoke(parameters); return CustomConvertTo<T>(obj); } public T Evaluate<T, T1>(Func<T1, T> method) { var parameters = DoMagicToGetTheParameterValues(method); var obj = method.DynamicInvoke(parameters); return CustomConvertTo<T>(obj); } public T Evaluate<T, T1, T2>(Func<T1, T2, T> method) { var parameters = DoMagicToGetTheParameterValues(method); var obj = method.DynamicInvoke(parameters); return CustomConvertTo<T>(obj); } // 可继续扩展至更多参数,比如T3、T4,覆盖绝大多数业务场景 }
2. 调用时的类型推断优化
现在调用者传入匿名函数时,编译器会自动根据参数的类型推断泛型参数,无需手动指定:
var instance = GetComplexObject(); // 单参数场景:自动推断T=string,T1=SimpleEntity var name = instance.Evaluate<string>((SimpleEntity simple) => { return simple.Name ?? simple.ToString(); }); // 双参数场景:自动推断T=int,T1=User,T2=Order var total = instance.Evaluate<int>((User u, Order o) => { return u.Points + o.Amount; });
3. 处理类型推断边缘场景
如果遇到编译器无法自动推断参数类型的情况(比如参数为object),只需显式指定匿名函数的参数类型即可,无需手动指定泛型参数:
var totalValue = instance.Evaluate<decimal>((object data1, object data2) => { return Convert.ToDecimal(data1) + Convert.ToDecimal(data2); });
.NET 7+的补充说明
在.NET 7及更高版本,编译器的类型推断能力有所提升,但核心依然无法实现“任意参数的委托”,不过重载方法的调用体验会更流畅,部分复杂场景的推断成功率更高。
内容的提问来源于stack exchange,提问作者Donald.Record
相关产品推荐
相关产品推荐

