2012-04-20 32 views
3

顯式實現的接口的屬性通常以接口的全名開頭。但是,如果它是一個嵌套接口,屬性的名稱會有點不匹配。接口的全名與顯式實現它的屬性之間的區別

namespace NS 
{ 
    public class Container 
    { 
     //FullName is NS.Container+ITest 
     public interface ITest 
     { 
      int Prop { get; } 
     } 
    } 

    public class Sample : Container.ITest 
    { 
     //Property's name is NS.Container.ITest.Prop 
     int Container.ITest.Prop { get; } 
    } 
} 

爲什麼房產的名稱不是NS.Container+ITest.Prop?或者界面最好命名爲NS.Container.ITest。這會更正確,不是嗎?

+0

你的代碼不能編譯。 – SLaks 2012-04-20 12:51:28

+0

@SLaks謝謝,修正。 – lorond 2012-04-20 12:52:46

+2

@Lorond:現在我沒有看到你的問題。 – SLaks 2012-04-20 12:53:30

回答

2

CLR生成的類型名稱與C#語言的命名約定不匹配。典型示例是List<int>,CLR類型名稱將類似於List'1(反引用)。這不是C#中的有效類型標識符,就像NS.Container + ITest也是無效的。

您需要在C#代碼中使用C#命名約定。

+0

我知道他們不符合命名約定。我只是想知道這種情況下是否還有其他命名約定。像'NS.Container + ITest'中的'+'告訴我們'ITest'屬於名爲'Container'的類或結構體。或者私有屬性'NS.ITest.Prop'會告訴我們它是'NS.ITest'接口的'Prop'屬性的顯式實現。它僅用於反思目的。我從來沒有想過在我的代碼中使用這樣的名字。 :) – lorond 2012-04-20 13:33:17

+1

它們有很多,包括C#編譯器自己爲您的代碼中未明確創建的類型生成的名稱。像lamdas和迭代器一樣。把它們全部列出似乎是浪費時間,因爲我可能錯過其中一個的機率。我猜,我並沒有真正明白這個問題的重點。 – 2012-04-20 13:38:00

+0

問題的關鍵是在屬性名稱'NS.Container.ITest.Prop'中有'.'而不是'+',就像它在接口名稱('NS.Container + ITest')中一樣。我期待着「NS.Container + ITest.Prop」這個名稱,並且感到驚訝的是它有點不同。 – lorond 2012-04-20 13:45:53

0

如果您認爲NS.Container+ITest表示ITest是NS.Container下的嵌套類,那麼NS.Container+ITest.Prop將是接口的成員。但Prop的實現是Sample(明確實現接口)的成員,該名稱與NS.Container.ITest.Prop的名稱匹配。嘗試訪問接口的成員是不可能的,因此解析匹配實現的名稱似乎是合理的。

+0

我不明白爲什麼作爲Sample成員的Prop會匹配該名稱。通常顯式實現的成員的名稱匹配接口的名稱,它屬於。 – lorond 2012-04-20 13:25:05