2017-09-25 5 views
5

C#7では、オブジェクトを一致する型のタプルに割り当てるときに呼び出されるDeconstructメソッドを実装できます。C#7:なぜタプルの分解がインターフェイスを通じて実装されていないのですか?

私はマイクロソフトがなぜこれを「魔法の方法」として実装することにしたのか疑問に思っています。この特別な名前のメソッドはどこから継承されていませんが、正しい名前を付けて正しいパラメータを入れると、このオブジェクトをそれぞれのタプルに割り当てることができます。

私は、設計チームがこの目的のためのインターフェイスを作成すると思います。以下のような

何か:もちろん

public interface IDecontructible<T1> 
{ 
    void Deconstruct(out T1 a); 
} 

public interface IDecontructible<T1, T2> 
{ 
    void Deconstruct(out T1 a, out T2 b); 
} 

public interface IDecontructible<T1, ... ,Tn> 
{ 
    void Deconstruct(out T1 a, ... ,out Tn n); 
} 

パラメータの数が異なる複数のインタフェースがあるとしています。

私が紛失しているこのデザインの選択肢には明らかな理由はありますか?

+0

FWIWこの特定のビットの設計ノート[ここにあります](https://github.com/dotnet/csharplang/blob/master/meetings/2016/LDM-2016-05-03-04.md)、デコンスターティングのメインページ(https://github.com/dotnet/roslyn/blob/master/docs/features/deconstruction.md)のリンクを参照してください。 –

+1

名前の推論はインタフェースでは不可能です。 –

答えて

10

方法を分解すると、オーバーロードすることができ、どのオブジェクトにも適用できます。それがインタフェースであれば、チームは元に戻って、能力を持ちたいすべてのタイプに適用しなければならず、実現可能ではないメソッドシグネチャごとに異なるものを持つ必要があります。例えば。

class Employee { 
    public string FirstName {get;set;} 
    public string Id {get;set;} 

    Deconstruct (out string firstName){ 
    firstName = FirstName; 
    } 

    Deconstruct (out string firstName, out string LastName){ 
    firstName = FirstName; 
    lastName = LastName; 
    } 

    Deconstruct (out int id){ 
    id = EmployeId; 
    } 
} 

現在の実装では、Disonstructの3つのバージョンを使用できます。また、Deconstructメソッドを拡張メソッドとして適用することもできます。これらのパターンは、単一のインタフェース実装では不可能です。

+0

あなたは拡張メソッドの良い点を持っています...私は、複数のDeconstructメソッドを実装するために、異なる引数を持つ複数のインターフェイスを実現できると思います。 –

関連する問題