2016-02-25 35 views
2

爲什麼代碼:爲什麼在比較方法的實現中必須包含接口的名稱?

class Person { 
    public int Age { get; set; } 
    public String Name { get; set; } 


    private class SortByName : IComparer<Person> { 
     int Compare(Person o1, Person o2) {//error 
      return 0; 
     } 
    }; 


    public static IComparer SortByName() { 
     return (IComparer)new SortByName(); 
    } 

    public override string ToString() { 
     return Name + " " + Age; 
    } 
} 

,我必須明確地寫:

int IComparer<Person>.Compare(Person o1, Person o2) 

,而是如果只是:

int Compare(Person o1, Person o2) 

這應該是很清楚,我從IComparer接口實現方法。

也可我莫名其妙地使此代碼更短:

private class SortByName : IComparer<Person> { 
     int Compare(Person o1, Person o2) {//error 
      return 0; 
     } 
    }; 


    public static IComparer SortByName() { 
     return (IComparer)new SortByName(); 
    } 

我知道,在C#匿名類無法實現的接口,但除了有任何拉姆達方式把它縮短?

+2

你忘了讓你的方法'公共'嗎?如果你這樣做,快速刪除這個問題可能是一個好主意:-) – dasblinkenlight

回答

3

如果要隱式實現接口,則必須公開方法。此代碼應該工作:

private class SortByName : IComparer<Person> 
{ 
    public int Compare(Person o1, Person o2) 
    { 
     return 0; 
    } 
}; 
+0

好吧,C#方面的一些預防措施可以抵消意外降低方法的可見性嗎? – Yoda

+0

簡單地說,接口指定類的公共契約。所有實現該接口的方法都應該是公共的。 –

相關問題