2017-06-09 3 views
1

同じ質問as this oneに明示的に実装される読み取り専用のインターフェイスプロパティに値を割り当てますが、C#7.0ではなく6.0のために:コンストラクタ

に値を代入する方法はあります読み取り専用明示的に実装されます( getterのみ)コンストラクタのインターフェイスプロパティ?それとも、同じ答え、つまりバッキングフィールドの回避策を使用していますか?例えば

interface IPerson 
{ 
    string Name { get; } 
} 

class MyPerson : IPerson 
{ 
    string IPerson.Name { get; } 

    internal MyPerson(string withName) 
    { 
     // doesn't work; Property or indexer 'IPerson.Name' 
     // cannot be assigned to --it is read only 
     ((IPerson)this).Name = withName; 
    } 
} 

対処法:あなたは、コンストラクタに拡張されている表現ボディのメンバーに言及していた場合

class MyPerson : IPerson 
{ 
    string _name; 
    string IPerson.Name { get { return _name; } } 

    internal MyPerson(string withName) 
    { 
     _name = withName; 
    } 
} 
+0

私はあなたが単に文字列IPerson.Name {get;プライベートセット; } '編集:テストの後、私は間違っていることが分かります。 – itsme86

+0

@ itsme86残念ながら、明示的なインターフェース実装では、 'IPerson.Name'を使うことはできません。もし彼が 'IPerson 'への明示的な参照を使わなかったなら、名前が重複しているために明示的な呼び出しが必要な時があります。 –

答えて

4

class MyPerson : IPerson 
{ 
    string _name; 
    string IPerson.Name => _name; 

    internal MyPerson(string withName) => _name = withName; 
} 

これは直接かかわらず、あなたの質問に対処していません。持ちますコンストラクタからインタフェース明示的なプロパティを設定する手段。しかし、将来的にはとなる可能性がありますが、保証はありません。

Proposal: Property-Scoped Fieldsこれは、コンテキスト内のキーワードfieldを、バッキングフィールドを参照するプロパティ内で、後者のフィールドを明示的に定義することなく使用できることを示しています。しかし、上記のリンクは、GitHubの上のC#言語のレポ上だけでディスカッショントピックにある

string IPerson.Name { get; } 
internal MyPerson(string withName) => IPerson.Name.field = withName; 

:これはまたの線に沿って構文を提供するかもしれない可能性があります。私はまだ(まだ)言語チームによって「賞賛されていません」と言いました。これは新しい機能と見なされる最初のステップです。だから、これは決して言語に追加されないでしょう(しかし、時にはオッズを無視するので決して決して言わない...)

+0

C#コンパイラが読み取り専用の自動プロパティを許可しない理由を説明している文書やディ​​スカッションはありますか?そのプロパティが明示的に実装されているコンストラクタで –

0

ありませんあなたはまだC#の7の同じ回避策が必要となりますこの制限を解除する効果はありません。 C#7のとおり、あなたができる最善のは、わずかにあなたのコードを簡素化するための式ボディの性質およびコンストラクタを利用することである