2017-09-25 44 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方法。 –

相关问题