【问题标题】:Generic methods overload mechanism [duplicate]泛型方法重载机制
【发布时间】:2019-11-08 10:11:39
【问题描述】:
        private static readonly List<List<T>> data = new List<List<T>>();

        private static void ProcessData(IEnumerable<IEnumerable<T>> data) { }

        private static void ProcessData(IEnumerable<IList<T>> data) { }

        private static void ProcessData(IList<IEnumerable<T>> data) { }

        private static void ProcessData(IList<IList<T>> data) { }

        static void Main(string[] args)
        {
            ProcessData(data);
        }
  1. 调用了哪个重载?
  2. 为什么?
  3. 如何在没有显式转换的情况下调用其他的?

【问题讨论】:

  • 这是一个测验问题吗?您是否尝试过运行此代码?你试过做研究吗?
  • 主函数中的数据是什么?
  • @Ego 看第一行代码。
  • 如果这些是重载方法,那么我希望所有人都在做同样的事情,那么你应该只有一种方法 'private static void ProcessData(IEnumerable> data) { }' 如果你是尝试这样做是错误的实施方式
  • 嗯,这是来自项目的实际代码,我刚刚添加了几个重载用于研究。 Visual Studio 显示将调用 IEnumerable> 重载。我不知道为什么。我认为这可能是第 1 次或第 4 次超载,但事实并非如此。

标签: c# .net generics interface


【解决方案1】:

首先请参阅 John Skeet 的这个答案,为什么不允许使用 List&lt;List&lt;string&gt;&gt; 调用重载 3 和 4: https://stackoverflow.com/a/9006016/10608418

现在 3 和 4 已经退出,选择 2 的原因是因为编译器寻找“最佳匹配”:Eric Lippert 在这个 SO 答案中涵盖了其中一些内容: https://stackoverflow.com/a/5174773/10608418

但基本上结果是 2 是最合适的(IList&lt;T&gt;IEnumerable&lt;T&gt;“更强”)。

【讨论】:

    猜你喜欢
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多