2013-03-20 5 views
2

아래 코드에서 .NET 2.0 Framework를 대상으로합니다.IComparable은 반 변형되지 않아도됩니까?

는 I은 사람 (기본 클래스)

그러나 프로그래머 보낸

는 사람 기대 비교 방법 프로그래머 (유도) 객체를 전달할 수

은 (간단한 OO 개념) 내가 .NET 4.0 것을에서 주장 ' 내가 키워드의 : 그렇지 않으면 저를 설득 해보세요

class Program 
{ 
    static void Main(string[] args) 
    { 
     var person = new Person(); 

     var test = person.CompareTo(new Programmer()); 
    } 
} 

internal class Person : IComparable<Person> 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int CompareTo(Person other) 
    { 
     return this.Id - other.Id; 
    } 
} 

class Programmer : Person 
{ 
    public string ProgrammingLanguage { get; set; } 
} 
+0

실제로 plz 그냥 'get'this .. :) – HerbalMart

+2

내 삶에 대한 질문이 무엇인지 알아낼 수 없습니다. 질문을 명확히 할 수 있습니까? 나는 차이가 분산과 할당 호환성 사이에 무엇인지에 대해 당신이 혼란 스러울 수 있다고 생각합니다. 그들은 종종 혼란 스럽다. http://blogs.msdn.com/b/ericlippert/archive/2009/11/30/what-s-the-difference-between-covariance-and-assignment-compatibility.aspx를 읽고 도움이되는지 확인해보십시오. –

+0

그 링크를 가져 주셔서 고맙지 만 지금은 "죄송합니다. 마지막 요청에 문제가 있습니다!"라는 메시지가 나타납니다. 희망 임시 thats ... – HerbalMart

답변

6

의 Co- 및 contravariance 제거 그들에 대해 Microsoft에 이메일을 작성하기 전에 잔인한 ':

'는에서 IComparable 인터페이스 선언의 키워드입니다 ' 유형에 관한 것이 아닙니다. 당신은 그 방법들에 빠져 든다. 그것은 메소드를 포함하는 제네릭 인터페이스에 관한 것입니다.

in 다음과 같은 코드는 법적 다음 in없이

IComparable<Person> foo = ...; 
IComparable<Programmer> bar = foo; 

은 불법이 될 것입니다.

+1

실제로 여기에서 제공하는 코드는 .NET4에서는 컴파일되지만 .NET2에서는 컴파일되지 않습니다. 나는 너희들이 옳다고 생각하고 여기서 개념을 뒤섞고있다. – HerbalMart

2

Liskov substitution principle에 의해 IComparer<> 구현이 Person 인스턴스를 비교할 수있는 경우 Person에서 파생 된 유형의 객체를 비교할 수 있습니다. in 키워드를 사용하면 IComparer<Person> 비교자를 사용하여 MyPerson (Person에서 파생 된) 유형의 개체를 비교할 수 있습니다. 예제 유스 케이스는 SortedList<Person>에 사용하기 위해 Person 인스턴스를 이름순으로 정렬하는 비교 자입니다. contravariant 인터페이스를 사용하면 SortedList<MyPerson>과 동일한 비교자를 사용할 수 있습니다.

관련 문제