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

+0

@SLaksありがとう、固定。 – lorond

+2

@Lorond:あなたの質問は表示されません。 – SLaks

答えて

2

CLRが生成する型名は、単にC#言語の命名規則と一致しません。標準的な例はList<int>で、CLRの型名はList'1(backquote)に似ています。 C#ではNS.Container + ITestのどちらも有効ではないので、これは有効な型識別子ではありません。

C#コードでは、C#命名規則を使用する必要があります。

+0

彼らは命名規則に合致しないことを知っています。私は、そのような場合に他の命名規則が存在するかどうか疑問に思います。 'NS.Container + ITest'の' + 'と同様に' ITest'は 'Container'という名前のクラスまたは構造体に属しています。またはプライベートプロパティ 'NS.ITest.Prop'は、それが' NS.ITest'インターフェースのための 'Prop'プロパティの明示的な実装であることを教えてくれます。反射目的のためだけです。私は自分のコードでこのような名前を使うことは考えていません。 :) – lorond

+1

コード内に明示的に作成されていない型に対してC#コンパイラ自身が生成する名前を含むたくさんの名前があります。 lamdasやiteratorsのように。それらをすべて列挙することは、私が欠場する可能性が高いので、時間の無駄に見える。私は本当に質問のポイントを得ていないと思います。 –

+0

問題点は、インターフェース名( 'NS.Container + ITest')のように' + 'ではなくプロパティ名' NS.Container.ITest.Prop'に '.'があることです。プロパティのNS.Container + ITest.Propという名前が期待されていて、少し違っていました。 – lorond

0

NS.Container+ITestが、ITestがNS.Containerの下のネストされたクラスであることを示しているとすると、NS.Container+ITest.Propはインターフェイスのメンバーになります。しかし、の実装は、NS.Container.ITest.Propという名前に一致するSample(インターフェイスを明示的に実装する)のメンバーです。インターフェイスのメンバにアクセスしようとすることはできないため、実装に一致する名前を解決することは合理的です。

+0

PropのメンバーがSampleのメンバーであることがなぜその名前と一致するのかという論理はありません。通常、明示的に実装されたメンバーの名前は、それが属するインターフェースの名前と一致します。 – lorond

関連する問題