C#Func参数重载-不明确

C#Func参数重载-不明确,c#,parameters,func,C#,Parameters,Func,我有两个函数,它们接受不同的Func参数。编译器告诉我它不能区分这些函数 (一) 公共静态异步任务SomeMethodName (Func Functionorun) (二) 公共静态异步任务SomeMethodName (Func Functionorun) 差别很小,但C#编译器似乎没有接受它,也看不出差别 Functype参数“未被检查”是否有原因 编辑-添加用户方法调用代码: 错误在这一行: var data = await SomeMethodName<model, mod

我有两个函数,它们接受不同的
Func
参数。编译器告诉我它不能区分这些函数

(一)

公共静态异步任务SomeMethodName
(Func Functionorun)
(二)

公共静态异步任务SomeMethodName
(Func Functionorun)
差别很小,但C#编译器似乎没有接受它,也看不出差别

Func
type参数“未被检查”是否有原因


编辑-添加用户方法调用代码: 错误在这一行:

var data = await SomeMethodName<model, model2>(someModel, SomeOtherMethod);
var data=wait SomeMethodName(someModel,SomeOtherMethod);
其他方法:

public static Task<model2[]> SomeOtherMethod(model model)
{
    Task<model2[]> data = SomeThirdMethodThatReturnsTasks(model);
    return data;
}
公共静态任务SomeOtherMethod(模型)
{
任务数据=返回任务的第三种方法(模型);
返回数据;
}
错误详细信息:

The call is ambiguous between the following methods or properties: 
SomeMethodName<model,model2>(model,System.Func<model,System.Threading.Tasks.Task<model2[]>>) 
and 
SomeMethodName<model,model2>(model,System.Func<model,System.Threading.Tasks.Task<model2>>)
以下方法或属性之间的调用不明确:
SomeMethodName(模型,System.Func)
及
SomeMethodName(模型,System.Func)

没有任何东西可以阻止
TResult
类型成为数组

让我们以该方法的使用为例:

var task = SomeMethodName((int i) => Task.FromResult(new[] { i }));
如果只定义了第二个方法,则此代码可以正确编译和运行。在这种情况下,您要拨打:

SomeMethodName<int, int[]>(Func<int, Task<int[]>> FunctionToRun)
SomeMethodName(函数运行)
如果只定义了第一个方法,那么cod也会编译并成功运行。那么你有:

SomeMethodName<int, int>(Func<int, Task<int[]>> FunctionToRun)
SomeMethodName(函数运行)

由于泛型参数不是签名的一部分,因此这两个函数在重载解析方面是相同的。如果这两个重载都存在,那么重载解析会将它们都标识为有效方法,并且根据定义的“更好性”,没有任何东西可以使其中一个比另一个“更好”“标准。由于它无法选择一个,因此会由于歧义而导致编译器错误。

问题不在于推断
TResult
,而在于
TSource
。当你有一个lambda像:

SomeMethodName(x => x.Something);
C#不知道什么是
x
,除非你告诉它。指定后,编译器应明确:

SomeMethodName<string, int>(x => x.Something); // or
SomeMethodName<string, int[]>(x => x.Something);
SomeMethodName(x=>x.Something);//或
SomeMethodName(x=>x.Something);

很抱歉,这些参数不是可选的。已编辑。请向我们显示调用方法的代码-这是您问题的重要部分。(我一直投反对票,直到这一切结束,因为这个问题是无法回答的含糊不清-这一切似乎对我来说都是可行的)你假设他使用的是lambda。如果他提供了一个方法组呢?在这种情况下,可以使用类型推断。您还可以为lambda提供参数的类型,然后类型推断也将成功。很明显,他在做类似的事情,因为他的错误消息不是推断类型错误的失败。@Servy是的,我没有考虑过这些情况;没有看到呼叫代码,我们都只是猜测。我听到了这个答案。这是有道理的,但解决办法是什么?重命名方法?(如果我有10种这样的方法,那就真的不太理想了)。
SomeMethodName(x => x.Something);
SomeMethodName<string, int>(x => x.Something); // or
SomeMethodName<string, int[]>(x => x.Something);