代码之家  ›  专栏  ›  技术社区  ›  vc 74

lambda代表解析

  •  2
  • vc 74  · 技术社区  · 14 年前

    我目前正在阅读乔恩·斯基特的《深度C》第二版,我想到了以下问题:

    编译器如何在 list.Sort(Comparison<T>) list.Sort(MyComparison<T>) 在以下示例中:

    // MyComparison has the same signature as Comparison<in T>
    public delegate int MyComparison<in T>(T x, T y);
    
    public class MyList<T> : List<T>
    {
        // Sort is like Sort(Comparison<T>) except it takes a MyComparison<T> in parameter
        public int Sort(MyComparison<T> comparison)
        {
            Console.WriteLine("Sort MyComparison<T>");
            return -1;
        }
    }
    
    MyList<Product> list = new MyList<Product>();
    
    list.Sort((product1, product2) => product1.Name.CompareTo(product2.Name));
    
    // Equivalent to
    list.Sort(new MyComparison<Product>((product1, product2) => product1.Name.CompareTo(product2.Name)));
    
    // But not equivalent to...
    list.Sort(new Comparison<Product>((product1, product2) => product1.Name.CompareTo(product2.Name)));
    

    提前谢谢

    2 回复  |  直到 14 年前
        1
  •  2
  •   Jon Skeet    14 年前

    如果重载解决方案遇到适用的方法,它将优先使用该方法 任何 在基类中声明的方法。所以在这种情况下,就好像 List<T>.Sort 甚至不存在,因为前两次调用。

    第三次召唤 不是 适用,所以会发现 列出<t>。排序 相反。

    如果你为 Sort 在内部 MyList (但采取 Comparison<T> 而不是 MyComparison<T> ) 然后 方法调用将不明确。

    看到我 overload resolution article 了解更多详细信息。

    希望你喜欢这本书:)

        2
  •  5
  •   Pieter van Ginkel    14 年前

    它选择这一个是因为它在儿童班,它更喜欢那些。

    例如:

    public class MyList<T> : List<T>
    {
        public int Sort2(MyComparison<T> comparison)
        {
        }
        public int Sort2(Comparison<T> comparison)
        {
        }
    }
    

    在这种情况下,它不再理解,并且:

    list.Sort2((product1, product2) => product1.Name.CompareTo(product2.Name));
    

    你会得到一个“呼叫不明确”的错误。