参数过载明显的模棱两可-仍然可以编译并正常工作吗?

费德里科·贝拉萨特吉

我们只是在我们的代码中找到了这些:

public static class ObjectContextExtensions
{

    public static T Find<T>(this ObjectSet<T> set, int id, params Expression<Func<T, object>>[] includes) where T : class
    {
        ...
    }

    public static T Find<T>(this ObjectSet<T> set, int id, params string[] includes) where T : class
    {
       ...
    }
}

如您所见,除了以外,它们具有相同的签名params

而且它们以多种方式被使用,其中一种:

DBContext.Users.Find(userid.Value); //userid being an int? (Nullable<int>)

这对我来说很奇怪,解决了第一个超载。

Q1:为什么这不会产生编译错误?

Q2:为什么C#编译器将上面的调用解析为第一个方法?

编辑:只是为了澄清,这是C#4.0,.Net 4.0,Visual Studio 2010。

埃里克·利珀特

这显然是过载解析中的错误。

它在C#5和C#3中复制,但在Roslyn中不复制;我不记得我们是否决定故意进行重大更改,或者这是否是意外事故。(我的机器上现在没有C#4,但是如果它在3和5中再现,那么几乎也肯定会在4中出现。)

我已经引起罗斯林团队前同事的注意。如果他们有任何有趣的回信给我,我会更新此答案。

由于我不再有权访问C#3/4/5源代码,因此我无法说出该错误的原因。考虑在connect.microsoft.com上报告它。

这是一个大大简化的复制:

class P
{
    static void M(params System.Collections.Generic.List<string>[] p) {}
    static void M(params int[] p)  {}
    static void Main()
    {
        M();
    }
}

它似乎与元素类型的通用性有关。奇怪的是,正如克里斯在回答中所指出的那样,编译器选择了更通用的代码!我本来希望该错误是另一种方法,然后选择不太通用的方法。

顺便说一句,该错误很可能是我的错,因为我在C#3中做了很多有关重载解析算法的工作。

更新

我在罗斯林(Roslyn)团队中的间谍告诉我,这是一个长期存在的过载解析错误。有一条决胜负规则被实施,从未被记录或证明是合理的,它说具有更大通用泛型的类型是更好的类型。这是一个没有道理的怪异规则,但从未将其从产品中删除。Roslyn团队在一段时间前决定采取重大更改并解决过载解决方案,以便在这种情况下产生错误。(我不记得那个决定,但是我们就这种事情做出了很多决定!)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Prolog的句子可以模棱两可吗?

来自分类Dev

模棱两可的方法编译错误

来自分类Dev

突然出现了对“下标”的模棱两可的使用,但是代码之前却可以正常工作

来自分类Dev

这实际上是模棱两可的吗?

来自分类Dev

使用JDBC的模棱两可的列,但查询在数据库中工作正常

来自分类Dev

@Autowired查找模棱两可的依赖关系,并且仍然有效。如何?

来自分类Dev

在Haskell中,即使启用AllowAmbiguousTypes,为什么类型仍然模棱两可?

来自分类Dev

为什么编译器会给出模棱两可的方法调用错误?

来自分类Dev

编译时错误:调用重载方法时模棱两可。为什么?

来自分类Dev

具有非恒定大小的字符串数组的模棱两可的编译?

来自分类Dev

编译时错误:调用重载方法时模棱两可。为什么?

来自分类Dev

是什么导致此Ada编译错误“模棱两可的文字”?

来自分类Dev

编译器声称变量是模棱两可的,将无法运行

来自分类Dev

下标使用模棱两可的编译器错误

来自分类Dev

如果模棱两可的有限状态机如何工作?

来自分类Dev

这些重载难道不是模棱两可的吗?

来自分类Dev

Java8中的模棱两可的重载-ECJ或Javac对吗?

来自分类Dev

SFINAE不能防止模棱两可的运算符重载吗?

来自分类Dev

ls实用程序无法解释模棱两可的文件引用吗?

来自分类Dev

什么时候可以使用读取进行模棱两可的解析?

来自分类Dev

git branch -r --merged引发错误:致命:模棱两可的参数'origin / HEAD-> origin / master':未知修订或路径不在工作树中

来自分类Dev

MSVC-C2668对重载函数的模棱两可的调用-它是编译器错误吗?

来自分类Dev

操作员的模棱两可的过载>>

来自分类Dev

“逆SFINAE”避免模棱两可的过载

来自分类Dev

传递继承的类型时,为什么编译器会给出模棱两可的调用错误?

来自分类Dev

重载采用通用类型的方法会导致模棱两可的方法调用编译错误

来自分类Dev

我正在尝试在C ++ 03中嵌套boost的“ map_list_of”,但显然构造是模棱两可的吗?

来自分类Dev

为什么程序被拒绝为模棱两可的程序,可以通过重载解析来解决?

来自分类Dev

通话似乎模棱两可,但在意外输出的情况下可以完美运行

Related 相关文章

  1. 1

    Prolog的句子可以模棱两可吗?

  2. 2

    模棱两可的方法编译错误

  3. 3

    突然出现了对“下标”的模棱两可的使用,但是代码之前却可以正常工作

  4. 4

    这实际上是模棱两可的吗?

  5. 5

    使用JDBC的模棱两可的列,但查询在数据库中工作正常

  6. 6

    @Autowired查找模棱两可的依赖关系,并且仍然有效。如何?

  7. 7

    在Haskell中,即使启用AllowAmbiguousTypes,为什么类型仍然模棱两可?

  8. 8

    为什么编译器会给出模棱两可的方法调用错误?

  9. 9

    编译时错误:调用重载方法时模棱两可。为什么?

  10. 10

    具有非恒定大小的字符串数组的模棱两可的编译?

  11. 11

    编译时错误:调用重载方法时模棱两可。为什么?

  12. 12

    是什么导致此Ada编译错误“模棱两可的文字”?

  13. 13

    编译器声称变量是模棱两可的,将无法运行

  14. 14

    下标使用模棱两可的编译器错误

  15. 15

    如果模棱两可的有限状态机如何工作?

  16. 16

    这些重载难道不是模棱两可的吗?

  17. 17

    Java8中的模棱两可的重载-ECJ或Javac对吗?

  18. 18

    SFINAE不能防止模棱两可的运算符重载吗?

  19. 19

    ls实用程序无法解释模棱两可的文件引用吗?

  20. 20

    什么时候可以使用读取进行模棱两可的解析?

  21. 21

    git branch -r --merged引发错误:致命:模棱两可的参数'origin / HEAD-> origin / master':未知修订或路径不在工作树中

  22. 22

    MSVC-C2668对重载函数的模棱两可的调用-它是编译器错误吗?

  23. 23

    操作员的模棱两可的过载>>

  24. 24

    “逆SFINAE”避免模棱两可的过载

  25. 25

    传递继承的类型时,为什么编译器会给出模棱两可的调用错误?

  26. 26

    重载采用通用类型的方法会导致模棱两可的方法调用编译错误

  27. 27

    我正在尝试在C ++ 03中嵌套boost的“ map_list_of”,但显然构造是模棱两可的吗?

  28. 28

    为什么程序被拒绝为模棱两可的程序,可以通过重载解析来解决?

  29. 29

    通话似乎模棱两可,但在意外输出的情况下可以完美运行

热门标签

归档