代码之家  ›  专栏  ›  技术社区  ›  Thomas Levesque

重载、泛型类型推断和“params”关键字

  •  5
  • Thomas Levesque  · 技术社区  · 16 年前

    我刚注意到一个奇怪的行为,有超负荷的决心。

    假设我有以下方法:

    public static void DoSomething<T>(IEnumerable<T> items)
    {
        // Whatever
    
        // For debugging
        Console.WriteLine("DoSomething<T>(IEnumerable<T> items)");
    }
    

    现在,我知道此方法通常会使用少量显式参数调用,因此为了方便起见,我添加了以下重载:

    public static void DoSomething<T>(params T[] items)
    {
        // Whatever
    
        // For debugging
        Console.WriteLine("DoSomething<T>(params T[] items)");
    }
    

    现在我尝试调用以下方法:

    var items = new List<string> { "foo", "bar" };
    DoSomething(items);
    DoSomething("foo", "bar");
    

    params IEnumerable<T> 在发生错误时要调用的重载 List<T> ,因为它看起来更匹配(至少对我来说)。

    1 回复  |  直到 16 年前
        1
  •  9
  •   Jon Skeet    16 年前

    public static void DoSomething<T>(T item)
    

    public static void DoSomething<T>(IEnumerable<T> item)
    

    这个 T 因为第一个匹配被推断为 List<string> T 因为第二个匹配被推断为 string .

    列表<字符串> ; 第二个是 IEnumerable<string>

    反直觉的一点是类型推断。如果你把它从等式中去掉,它会像你期望的那样工作:

    var items = new List<string> { "foo", "bar" };
    DoSomething<string>(items);
    DoSomething<string>("foo", "bar");