2009-03-16 11 views
1

私は文字列型のプロパティを実装するタイプがあると:明示的なInterface実装で、同じ名前の暗黙的なプロパティを参照できますか?

public class Record 
{ 
    public string Value { get; set; } 
} 

そして私は同じ名前のプロパティを定義するインターフェイスを有する:

public interface IIntValued 
{ 
    public int Value { get; set; } 
} 

Iのように、明示的なインタフェースを使用することができ次のようになります:

public class Record : IIntValued 
{ 
    public string Value { get; set; } 
    int IIntValued.Value 
    { 
      get{ return 0; } set{} 
    } 
} 

ただし、私の明示的なインターフェイスで文字列 "値"を参照できるようにしたいのですが、それはできますか?もしそうなら、どうですか?私は「値」プロパティ「大切INT「での発現のためのプロパティ」「値文字列」」値をしたい、あなたが見ることができるように

public class Record : IIntValued 
{ 
    public string Value { get; set; } 
    public int IIntValued.Value 
    { 
      get 
      { 
       string value = /*Magic here*/.Value; 
       return int.parse(value); 
      } 
      set{} 
    } 
} 

:私はそれのようなものであることを想像してみてください。別の明示的に実装されたインターフェイスメンバーだった場合は、そのインターフェイスに型キャストしてから使用できますが、暗黙の型メンバーの場合はどうすれば動作しますか?

注:この例は少し工夫されていますが、うまくいけば言語の質問を示しています。

答えて

3

を暗黙の型のメンバの場合は、ちょうどValueまたはthis.Valueは問題ないはず - それは、デフォルトでIIntValued.Valueに解決されませんので。

+0

コンパイラは、手動で行う必要があると自動的に判断します。 *一息*私はそれが損失ではないと思うが、今やC#のいくつかの新しい部分が私の脳内をクリックしたように。ありがとう! – el2iot2

1

はい、両方のプロパティにアクセスできます。プロパティへのアクセスに使用される変数のタイプによって異なります。お守り:

Record myInstanceAsRecord = myInstance; 
IIntValued myInstanceAsIIntValued = myinstance; 

string valueAsString = myInstanceAsRecord.Value; 
int valueAsInt = myInstanceAsIIntValued.Value; 
0

要約を書いた後、私は答えを知っていることに気付きました。 :P 私はthisを取り、クラスタイプにそれを型キャスト場合は、明示的な実装は含まれません。

string value = ((Record)this).Value; //is the implicit string. 

編集:さらにいくつか入力した後に(!ありがとう応答を)​​それがいることを指摘されたがコンパイラが自動的に何かを手動で行う必要はありません。従って:

string value = this.Value; 

が働いたであろう。もちろん、thisはインターフェイス変数ではないため、暗黙的なプロパティはデフォルトで選択されたものになるためです。

2

もちろん可能です!問題は、アクセシビリティのキーワードを違法な場所に配置していたことです。明示的に実装されたメンバーはアクセシビリティキーワードを持つことはできません。暗黙的に実装されたものは、IIntValueから書き出されます。メンバー名の接頭辞。

ここには動作するサンプルがあります。

public interface IIntValued 
{ 
    int Value { get; set; } 
} 

public class Record : IIntValued 
{ 
    public string Value { get; set; } 
    int IIntValued.Value 
    { 
    get 
    { 
     string value = this.Value; 
     return int.Parse(value); 
    } 
    set { } 
    } 
} 
+0

"public"は私の模擬した例ではミスタイプでしたが、それを区別するために+1しました。 – el2iot2

関連する問題