2017-09-25 45 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; 
    } 
} 

隨着目前的實施,你可以有三個版本的Deconstruct。另外,您可以將Deconstruct方法應用爲擴展方法。這些模式對於單個接口實現來說是不可能的。

+0

你對擴展方法有很好的理解......我認爲你可以通過不同的參數實現多個接口來實現多個Deconstruct方法。 –

相關問題