如果您尝试编译此代码......
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();
}
}
...你会收到这个错误:
无法从用法中推断出方法
ConsoleApplication1.Foo.GetBarCore<TBar>(System.Func<TBar>)
的类型参数。尝试明确指定类型参数。
我花了一些时间才发现getter:
上的命名参数(GetBarCore()
)是罪魁祸首。如果删除参数名称,只留下GetBarCore(Find)
,代码将成功编译。不出所料,如果正如错误消息所示,您明确指定了类型参数(导致GetBarCore<StandardBar>(getter: Find)
),您也可以成功编译代码。
(顺便说一下,这个小特质也绊倒了ReSharper。我有一些代码工作正常。我对代码文件做了一个非常小的改动并执行了一个“清理代码”操作,它删除了R#认为的“多余的“代码。好吧,它在一个带有命名参数的方法调用中删除了一个看似不必要的显式类型参数,突然间,我的代码无法编译。”
有人可以解释为什么提供命名参数会使编译器无法从使用中推断出类型参数吗?
答案 0 :(得分:2)
Mono的C#编译器(在Mono 2.10.9中使用dmcs测试)非常乐意在使用命名参数时推断出类型。我仍然试图在标准中找到表示一种行为或另一种行为的东西,但我怀疑这只是csc.exe
中的一个错误。
在C#5.0中似乎也可以使用csc.exe
。 (使用LINQPad 4.43.06测试。)