【问题标题】:C# 7: Why is tuple deconstruction not implemented through an interface?C# 7:为什么不通过接口实现元组解构?
【发布时间】:2026-02-17 08:30:01
【问题描述】:

在 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);
}

当然必须有更多具有不同数量参数的接口。

我缺少这种设计选择的明显原因吗?

【问题讨论】:

标签: .net c#-7.0


【解决方案1】:

因为解构它的方式,你可以重载它,它可以应用于任何对象。如果它是一个接口,那么团队将不得不返回并将其应用于他们希望拥有它的每种类型,并且他们需要为每个方法签名提供不同的接口,这是不可行的。例如。

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 方法用作扩展方法。这些模式对于单个接口实现是不可能的。

【讨论】:

  • 你有一个很好的扩展方法......我认为你可以实现具有不同参数的多个接口来实现多个解构方法。