C#类型推断失败,包含默认参数的方法

C#类型推断失败,包含默认参数的方法,第1张

概述说我有以下方法: static int MethodWithDefaultParameters(int a, int b=0, int c=1){ return a + b + c;} 然后我在LINQ查询中使用此方法,如下所示: Enumerable.Range(1,10).Select(MethodWithDefaultParameters); 这失败了: Error 1 The 说我有以下方法:
static int MethoDWithDefaultParameters(int a,int b=0,int c=1){    return a + b + c;}

然后我在liNQ查询中使用此方法,如下所示:

Enumerable.Range(1,10).Select(MethoDWithDefaultParameters);

这失败了:

Error 1 The type arguments for method ‘System.linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)’ cannot be inferred from the usage. Try specifying the type arguments explicitly.

当然,我可以通过插入一个转发函数调用的lambda来解决这个问题:

Enumerable.Range(1,10).Select(i => MethoDWithDefaultParameters(i));

但我的问题是为什么类型推断失败了?据我所知,它不应该是模糊的,因为只有一个函数变量满足输入变量.

解决方法 Select()有两个重载.将第二个参数(即代理)作为Func< TSource,TResult>以及采用Func< TSource,int,TResult>的一个参数.即具有一个参数或两个参数的方法签名.

你的方法既不满足.即使使用默认值,它仍然有三个参数.默认参数是编译时构造,必须在调用站点提供.它们不会在运行时通过调用委托实例来填充.

因此,事实上,您的解决方案是解决问题的两种合理方法之一.另一种方法是以不同方式实现默认参数(即“old-school”:)):

static int MethoDWithDefaultParameters(int a){    return MethoDWithDefaultParameters(a,1);}static int MethoDWithDefaultParameters(int a,int b,int c){    return a + b + c;}

然后,您可以直接调用Select()来使用MethoDWithDefaultParameters,因为编译器将找到与Select()重载之一兼容的单参数重载.

总结

以上是内存溢出为你收集整理的C#类型推断失败,包含默认参数的方法全部内容,希望文章能够帮你解决C#类型推断失败,包含默认参数的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1263660.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存