2009-07-24 1 views
0

대신 무엇을 써야합니까? ??????? 적절한 과부하를 선택 하시겠습니까?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]); 
     } 
    } 
} 

답변

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) {} 

을 그러나, 나는 강하게이 같은 경우에 당신이 가능한 과부하를 방지하려고하는 것이 좋습니다 것입니다. 메소드에 고유 한 이름을 지정하십시오. 읽기 쉽고 모호한 것을 피할 수 있습니다.

+0

감사합니다. – UserControl

0

값에 따라 원하는 작업이 결정됩니다. 그냥 대리자를 전달하려는 경우이 경우 다음

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

을 할 수는 <C> 부분이 실제로 중단 할 수 있습니다. 컴파일러는 매개 변수를 추론 할 수 있습니다.

나는 compareer라는 매개 변수에 대해 Action<T,T>을 선택했는지 궁금합니다. 비교 함수는 일반적으로 두 값을 비교 한 결과를 나타내는 값을 반환합니다. Action<T,T> 형식은 단지 void를 반환합니다. 그것은 가능성이 비교 함수

  • 변경 값을 반환하지 않는 함수의 더 indicitive 뭔가 매개 변수 이름에 대한보다 표준 서명입니다 Func<T,T,int>로 변경하거나

    1. 해야한다. del, action 또는 func와 같습니다.