Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中引用适当的非泛型重载?_C#_Generics_Overloading - Fatal编程技术网

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

如何在c#中引用适当的非泛型重载?,c#,generics,overloading,C#,Generics,Overloading,我应该写什么来代替???????选择合适的过载 using System; using System.Collections.Generic; namespace ConsoleApplication2 { class A {} class B : A {} class C : A {} class Program { static void Main(string[] args) { var

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

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]);
        }
    }
}
使用系统;
使用System.Collections.Generic;
命名空间控制台应用程序2
{
A类{}
B类:A{}
C类:A{}
班级计划
{
静态void Main(字符串[]参数)
{
var l1=新列表();
var l2=新列表();
比较器(l1,l2,l2);
}
空比较(cA,cB){}
无效比较(ba,bb){}
无效比较(IList a、IList b、动作比较器)
{
for(int i=0;i
这取决于您希望如何处理这些值。如果您只想传递一个委托,可以执行以下操作

Comparer<C>(l1,l2, (left,right) => {});
比较器(l1,l2,(左,右)=>{};
在这种情况下,零件实际上可以省略。编译器将能够推断参数

我很好奇您为名为comparer的参数选择了
Action
。比较函数通常返回一个值,该值表示比较两个值的结果。
操作
类型只返回void。很可能是这样

  • 更改为
    Func
    ,这是比较函数的更标准签名
  • 将参数名称更改为不返回值的函数的更具指示性的名称。像del、action或func

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

    Comparer<C>(l1,l2, (left,right) => {});
    
    比较器(l1,l2,(左,右)=>{};
    
    在这种情况下,零件实际上可以省略。编译器将能够推断参数

    我很好奇您为名为comparer的参数选择了
    Action
    。比较函数通常返回一个值,该值表示比较两个值的结果。
    操作
    类型只返回void。很可能是这样

  • 更改为
    Func
    ,这是比较函数的更标准签名
  • 将参数名称更改为不返回值的函数的更具指示性的名称。像del、action或func

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

    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]);
    }
    
    但是,我强烈建议在这种情况下,尽可能避免过载。给方法起一个不同的名字——这将使它更容易阅读,并避免任何歧义