【发布时间】:2012-12-10 16:35:55
【问题描述】:
如果您尝试编译此代码...
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# 认为的“冗余”代码。嗯,它删除了我在使用命名参数的方法调用中看似不必要的显式类型参数之一,突然间,我的代码无法编译。)
谁能解释为什么提供命名参数会使编译器无法从用法中推断出类型参数?
【问题讨论】:
-
@PLB,你是对的,我的问题几乎是一样的。我不知道为什么我在搜索中没有遇到它。
标签: c# generics delegates resharper named-parameters