2014-03-27 4 views
0

이 주제와 관련하여 많은 비슷한 질문이 있다는 것을 이미 알고 있습니다. 그러나 응답을보고 해당 질문과 관련하여 코드를 수정하는 것은 실패한 것으로 나타났습니다.IComparable : 공용이 아니기 때문에 인터페이스 멤버를 구현할 수 없습니다.

아래 코드는 내가 전달 된 아티스트의 이름과 아티스트 이름 (OBJ) 사이 비교 compareTo와를 사용하여 내 아티스트 클래스의 일부입니다 ..

class Artists : IComparable 
{ 
    private string artistName; 
    private string artistMembers; 

    public int CompareTo(Object obj) 
    { 
     Artists otherArtist = (Artists)obj; 
     return artistName.CompareTo(otherArtist.ArtistName); 
    } 


    public Artists(string artist, string members){ 
     ArtistName = artist; 
     Members = members; 
    } 

    public string ArtistName 
    { 
     set { artistName = value; } 
     get { return artistName; } 
    } 
    public string Members 
    { 
     set { artistMembers = value; } 
     get { return artistMembers; } 
    } 

} 

은 정말 변수을 피하려고 공개적으로 다른 곳에서 제공되는 솔루션이므로이 문제를 해결하기 위해 내가해야 할 일이 무엇인지 궁금하여 실수로 배울 수 있도록 잘못하고 있습니다.

미리 감사드립니다.

편집 2 닫힌 VS 다시 컴파일되고 갑자기 작동합니다. 시간 낭비해서 죄송합니다.

+0

내가 잃어버린, 작동하지 않는/위의 코드에서 변경 하시겠습니까? – BradleyDotNET

+0

코드가 컴파일됩니다 - 무엇이 _ 정확합니까? –

+2

비 제네릭 버전 대신에'IComparable '을 구현하는 것을 고려해야합니다. – Lee

답변

3

나는 CompareTo실제 코드 하지public 당신의 오류를 가정하고있다. 암시 적 인터페이스 구현은 공개되어야합니다.

당신은 인터페이스 명시 적으로을 구현할 수있는 다음 클라이언트가 방법을 볼 수 IComparable으로 캐스팅해야합니다 :

int IComparable.CompareTo(Object obj) // will be private unless explicitly using the interface 
{ 
    Artists otherArtist = (Artists)obj; 
    return artistName.CompareTo(otherArtist.ArtistName); 
} 

Artists a1 = new Artists("Beatles", "Paul, Ringo"); 
Artists a2 = new Artists("U2", "Bono"); 
// this will fail: 
//int i = a1.CompareTo(a2); 

// this will work: 
int i = ((IComparable)a1).CompareTo(a2); 

그러나 클래스는 기본적으로 internal이므로주의를, 그래서 클래스은 (는) 공개하지 않습니다.