C# 为什么包含命名参数会导致一个;无法从用法推断方法的类型参数";错误?

C# 为什么包含命名参数会导致一个;无法从用法推断方法的类型参数";错误?,c#,generics,delegates,resharper,named-parameters,C#,Generics,Delegates,Resharper,Named Parameters,可能重复: 如果您试图编译此代码 public interface IBar { } public class StandardBar : IBar { } public class Foo { public TBar GetBarCore<TBar>(Func<TBar> getter) where TBar : IBar { return getter(); } public StandardBa

可能重复:

如果您试图编译此代码

public interface IBar { }

public class StandardBar : IBar { }

public class Foo
{
    public TBar GetBarCore<TBar>(Func<TBar> getter)
        where TBar : IBar
    {
        return getter();
    }

    public StandardBar GetBar()
    {
        return GetBarCore(getter: Find);
    }

    public StandardBar Find()
    {
        return new StandardBar();
    }
}
公共接口IBar{}
公共类StandardBar:IBar{}
公开课Foo
{
公共TBar GetBarCore(Func getter)
哪里有TBar:IBar
{
返回getter();
}
公共标准栏GetBar()
{
返回GetBarCore(getter:Find);
}
公共标准条查找()
{
返回新的标准条();
}
}
…您将得到以下错误:

无法从用法推断方法
ConsoleApplication1.Foo.GetBarCore(System.Func)
的类型参数。尝试显式指定类型参数

我花了一段时间才发现
GetBarCore()
上的命名参数(
getter:
)是罪魁祸首。如果删除参数名,只保留
GetBarCore(Find)
,代码将成功编译。不那么令人惊讶的是,如果如错误消息所示,显式指定类型参数(导致
GetBarCore(getter:Find)
),也可以成功编译代码

(顺便说一句,这个小小的怪癖也让ReSharper出错了。我有一些代码工作得很好。我对代码文件做了一个很小的更改,并执行了一个“清理代码”操作,删除了R#认为是“多余的”代码。)好吧,它删除了我在带有命名参数的方法调用上的一个看似不必要的显式类型参数,突然,我的代码无法编译。)

有人能解释为什么提供命名参数会使编译器无法从用法推断类型参数吗?

Mono的C#编译器(在Mono 2.10.9中使用dmcs进行测试)非常乐意推断类型,即使使用命名参数也是如此。我仍在试图在标准中找到一些指示一种或另一种行为的东西,但我怀疑这只是
csc.exe
中的一个bug


在C#5.0中,似乎还可以很好地使用csc.exe。(使用LINQPad 4.43.06进行测试。)

@PLB,你说得对,我的问题基本相同。我不知道为什么我在搜索中没有发现它。谢谢你的回答,+1。事实证明,这是一个错误。看见