繁体   English   中英

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

[英]How to reference proper non-generic overload in c#?

我写什么代替??????? 选择适当的过载?

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

您只需要使方法静态化并修复方法名称即可。 您甚至可以在对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) {}

但是,我强烈建议您在这种情况下尽量避免过载。 为方法指定不同的名称-使其更易于阅读,并避免任何歧义。

这取决于您要使用这些值。 如果您只想通过代表,则可以执行以下操作

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

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

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

  1. 更改为Func<T,T,int> ,这是比较功能的更标准签名
  2. 将参数名称更改为更能指示不返回值的函数。 像del,动作或func。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM