mil*_*osz 31 c# overload-resolution c#-6.0
我们最近从公司的VS2013搬到了VS2017.升级后,我们的代码库将不再构建.我们会收到以下错误:
以下方法或属性之间的调用不明确:'IRepository <T> .Get(object,params Expression <Func <T,object >> [])'和'IRepository <T> .Get(object,params string [] )"
这是呼叫本身:
this.mainRepository.Get(newEntity.Id);
Run Code Online (Sandbox Code Playgroud)
...和接口定义:
public interface IRepository<T> where T : class
{
T Get(object id, params Expression<Func<T, object>>[] includeExprs);
T Get(object id, params string[] includeExprs);
}
Run Code Online (Sandbox Code Playgroud)
我想知道这里是否有人可以解释为什么会这样.我怀疑C#6.0 的新改进方法重载解析功能,但查看语言规范我无法找出导致该问题的确切规则.
编辑
我写了一篇关于这个问题的后续博客文章:http://codewithstyle.info/method-overload-resolution-in-c-6-0-an-interesting-bug-story
ang*_*son 37
我在升级到Visual Studio 2015时发现了同样的事情,因此2017年并不新鲜,但自2013年以来它是新的.
我在github上报道了这里:
在VS2013中编译的代码在2015年与CS0121失败; 带有不同params参数类型的重载#4458:
问题是,代码是不明确的,新的罗斯林编译器在这方面比以前的编译器更严格.
该问题已关闭,其中包含更改文档而不是恢复旧行为的操作,作为问题的一部分将有关#4458的信息添加到"Overload Resolution.md"#4922.
特别是,AlekseyTs评论说:
为了我们的重载解析代码的未来健康,我们决定保持破坏(和正确)行为.如果我们得到的不仅仅是这个案例,我们可能需要重新评估.
所以你有它.新编译器对此更严格,您需要更改代码.
鉴于AlekseyTs上面的评论,您可能需要考虑在github上向Microsoft报告此情况作为另外一种情况.如果2017年这个问题变得越来越普遍,因为很多人/公司都在等待升级,因为评论说他们可能想重新评估.
此外,您在(较旧的)文档中没有找到任何关于此内容的原因是,这是旧编译器的"隐藏功能",从他们对文档所做的更改中可以看出:
在存在未使用的param-array参数的情况下,旧编译器实现了重载解析的特殊规则(不在语言规范中),而Roslyn对规范的更严格解释(现已修复)阻止了某些程序的编译.
(我的重点)
当我们在代码中修复相同类型的问题时,我们最终得到了类似的东西(使用代码的示例):
public interface IRepository<T> where T : class
{
T Get(object id, Expression<Func<T, object>>[] tieBreaker, params Expression<Func<T, object>>[] includeExprs);
T Get(object id, string tieBreaker, params string[] includeExprs);
}
Run Code Online (Sandbox Code Playgroud)
注意添加两个tieBreaker参数
然后我们将显式参数包含在集合中,其他内部.如果你需要能够使用这些可选的额外参数来调用方法,你应该添加第3个重载,不要让它们明确指出应该调用哪个重载,这样你的最终接口可能如下所示:
public interface IRepository<T> where T : class
{
T Get(object id);
T Get(object id, Expression<Func<T, object>>[] tieBreaker, params Expression<Func<T, object>>[] includeExprs);
T Get(object id, string tieBreaker, params string[] includeExprs);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1409 次 |
| 最近记录: |