0

我写什么而不是??????选择合适的过载?

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]);
        }
    }
}
4

2 回答 2

5

您只需将方法设为静态并修复方法名称。您甚至可以在初始调用时使用类型推断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) {}

但是,我强烈建议在这种情况下尽量避免重载。给这些方法起不同的名字——它会让它更容易阅读,并避免任何歧义。

于 2009-07-24T06:04:49.377 回答
0

这取决于您要对这些值做什么。如果您只想传递一个代表,您可以执行以下操作

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

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

我很好奇您对Action<T,T>名为 comparer 的参数的选择。比较函数通常返回一个值,该值表示比较两个值的结果。该Action<T,T>类型只返回 void。它应该是

  1. 更改Func<T,T,int>为比较函数的更标准签名
  2. 将参数名称更改为更能指示不返回值的函数的名称。像 del、action 或 func。
于 2009-07-24T06:03:59.393 回答