【问题标题】:Is it possible to overload deconstructors in C# 7.0?是否可以在 C# 7.0 中重载解构函数?
【发布时间】:2017-06-15 09:59:50
【问题描述】:

在 C# 7.0 中,我可以为我的类声明以下解构函数:

public class Customer
{
    public string FirstName { get; }
    public string LastName { get; }
    public string Email { get; }

    public Customer(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public void Deconstructor(out string firstName, out string lastName, out string company)
    {
        firstName = FirstName;
        lastName = LastName;
        company = "Nop-Templates";
    }

    public void Deconstructor(out string firstName, out string lastName)
    {
        firstName = FirstName;
        lastName = LastName;
    }
}

我想在解构器中使用我们的变量而不是直接返回一个元组的想法是这样你就可以有不同的解构器重载。但是,我似乎无法将对象解构为三个变量。我只能将其解构为两个变量。

例如,这不会编译:

(string firstName, string lastName, string company) = customer;

我得到这个错误:

“不能将 '2' 个元素的元组解构为 '3' 个变量。”

但这确实有效:

(string firstName, string lastName) = customer;

我错过了什么?

【问题讨论】:

  • 可以重载Deconstruct方法,参数数量不同,类型不同。
  • 当你说“这不编译......但是这个”,有什么区别?这两段代码与我看起来 100% 相同。
  • 如果这是真正的代码会有所帮助 - 除非您的问题只是您为 Deconstruct 方法使用了错误的名称?
  • 另外,你可能会告诉代码没有编译时抛出的错误
  • 如果您将方法命名为 Deconstruct 而不是 Deconstructor,则代码编译,如果您使用错误的名称保留它们,您收到的错误消息与您提到的关于 a 的错误消息不同元组。再次,请发帖minimal reproducible example。

标签: c# visual-studio-2017 c#-7.0


【解决方案1】:

你调用了你的方法,Deconstructor,而不是Deconstruct。此外,您不能在两个元组中重新声明 firstName 和 lastName。进行这些更改,以下代码行都可以正常编译:

var customer = new Customer("a", "b");
(string firstName1, string lastName1, string company) = customer;
(string firstName2, string lastName2) = customer;

【讨论】:

  • 因此,由于他说他有编译器错误,因此必须有更多错误。
  • @LasseV.Karlsen,他声称(string firstName, string lastName) = customer; 编译是没有意义的;它不能按照他的代码当前的方式编译。如果方法更改为Deconstruct,那么它会编译。
  • 你说的都是对的。首先,我错误地将方法称为 Deconstructor。但我试图解构的客户也来自外部服务(只是一个演示),而这个服务实际上返回一个元组。我认为它正在返回一个 Customer 对象并试图解构它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多