C# 7:为什么元组解构没有通过接口实现?

6
在C# 7中,我们可以实现一个名为Deconstruct的方法,当将对象分配给具有匹配类型的元组时,该方法将被调用。
我想知道微软为什么决定将其实现为"魔法方法"。有这个特别命名的方法,它没有从任何地方继承,如果你正确命名并放置正确的参数,那么你就能将这个对象分配给相应的元组。
我想象一下,设计团队会为此创建一个接口。
像这样的东西:
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);
}

当然,还需要更多具有不同参数数量的接口。
这种设计选择是否有明显的原因,我有所遗漏吗?

这个特定位的设计说明可以在这里找到,更多讨论可以从主要Deconstruction页面中链接 - James Thorpe
1
使用接口无法推断名称。 - Rene Niediek
1个回答

11

因为使用Deconstruct的方式,你可以对其进行重载,并且它可以应用于任何对象。如果它是一个接口,那么团队将不得不返回并将其应用于他们想要具有该功能的每种类型,并且他们需要针对每个方法签名拥有不同的接口,这是不可行的。例如。

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方法应用为扩展方法。这些模式在单一接口实现下是不可能的。


你提到的扩展方法很有道理... 我认为你可以使用不同参数实现多个Deconstruct方法来实现多个接口。 - Filip Minx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接