2012-04-20 48 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