为什么包含命名的自变量会导致“;方法的类型参数不能从用法“”中推断出来;错误
本文关键字:用法 推断出 错误 不能 类型参数 自变量 包含命 方法 为什么 | 更新日期: 2023-09-27 17:49:18
可能重复:
C#4.0 中的命名参数和泛型类型推理
如果您试图编译此代码。。。
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>)
的类型参数。请尝试显式指定类型参数。
我花了一段时间才发现GetBarCore()
上的命名参数(getter:
(是罪魁祸首。如果删除参数名称,只留下GetBarCore(Find)
,则代码编译成功。不出所料,如果如错误消息所示,显式指定了类型参数(导致GetBarCore<StandardBar>(getter: Find)
(,则也可以成功编译代码。
(顺便说一句,这个小特性也让ReSharper绊倒了。我有一些代码运行良好。我对代码文件做了一个非常小的更改,并执行了一个"清理代码"操作,删除了R#认为"多余"的代码。好吧,它删除了我在一个带有命名参数的方法调用上的一个看似不必要的显式类型参数,突然间,我的代码就无法编译了。)
有人能解释为什么提供命名参数会使编译器无法根据用法推断类型参数吗?
Mono的C#编译器(在Mono 2.10.9中使用dmcs进行了测试(非常乐意推断类型,即使使用命名参数也是如此。我仍在尝试在标准中找到指示一种或另一种行为的东西,但我怀疑这只是csc.exe
中的一个错误。
在C#5.0中使用csc.exe
似乎也很好。(使用LINQPad 4.43.06进行测试。(