簡體   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