代码之家  ›  专栏  ›  技术社区  ›  UserControl

如何在c#中引用适当的非泛型重载?

  •  0
  • UserControl  · 技术社区  · 16 年前

    我应该写什么来代替???????选择合适的过载?

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApplication2
    {
        class A {}
    
        class B : A {}
    
        class C : A {}
    
        class Program
        {
            static void Main(string[] args)
            {
                var l1 = new List<C>();
                var l2 = new List<C>();
                Comparer<C>(l1, l2, ???????);
            }
    
            void Compare(C a, C b) { }
    
            void Compare(B a, B b) {}
    
            void Compare<T>(IList<T> a, IList<T> b, Action<T,T> comparator)
            {
                for (int i = 0; i < a.Count; i++)
                    comparator(a[i], b[i]);
            }
        }
    }
    
    2 回复  |  直到 16 年前
        1
  •  5
  •   Jon Skeet    16 年前

    您只需要将方法设置为静态并修复方法名称。您甚至可以在对的初始调用中使用类型推断 Compare :

    static void Main(string[] args)
    {
        var l1 = new List<C>();
        var l2 = new List<C>();
    
        Compare(l1, l2, Compare);
    }
    
    static void Compare(C a, C b) {}
    
    static void Compare(B a, B b) {}
    
    static void Compare<T>(IList<T> a, IList<T> b, Action<T,T> comparator)
    {
        for (int i = 0; i < a.Count; i++)
            comparator(a[i], b[i]);
    }
    

    在这种情况下,没有歧义- Compare(C, C) Action<C, C> . 如果你有一个 Compare(A, A) 方法,则仍将选择更具体的方法。如果相反,您有:

    static void Compare(A a, C b) {}
    static void Compare(C a, A b) {}
    

    不过,我会的 强烈地 建议在这种情况下,尽可能避免过载。给方法起一个不同的名字——这将使它更容易阅读,并避免任何歧义。

        2
  •  0
  •   JaredPar    16 年前

    这取决于您希望如何处理这些值。如果您只想传递一个委托,可以执行以下操作

    Comparer<C>(l1,l2, (left,right) => {});
    

    在这种情况下,<C>这一部分实际上可以省略。编译器将能够推断参数。

    我很好奇你选择了哪一个 Action<T,T> 对于名为comparer的参数。比较函数通常返回一个值,该值表示比较两个值的结果。这个 行动<T、 T> 类型只返回void。很可能是这样

    1. 改为 Func<T,T,int> 哪个是比较函数的标准签名
    2. 将参数名称更改为不返回值的函数的更具指示性的名称。像del、action或func。
    推荐文章