C# 7.0中是否可以重载析构函数?

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

我错过了什么?

1
你可以使用不同数量和不同类型的参数重载 Deconstruct 方法。 - Lasse V. Karlsen
6
当你说“这个不能编译,但那个可以”时,它们之间有什么不同?这两段代码在我看来完全一样。 - Lasse V. Karlsen
1
如果这是真正的代码就更好了——除非你的问题只是使用了错误的名称来命名你的“Deconstruct”方法? - Damien_The_Unbeliever
3
此外,当代码无法编译时,您可以告诉所抛出的错误。 - Pikoh
2
如果您将方法命名为“Deconstruct”而不是“Deconstructor”,则代码将编译,如果您保留错误的名称,则会收到与元组有关的不同错误消息。请再次发布一个[mcve]。 - Lasse V. Karlsen
显示剩余3条评论
1个回答

3

您将方法命名为Deconstructor,而不是Deconstruct。此外,在两个元组中,您不能重新声明firstNamelastName。进行这些更改,以下代码行都可以编译:

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

1
因此,由于他说他有编译器错误,因此必须有更多的问题。 - Lasse V. Karlsen
2
@LasseV.Karlsen声称(string firstName, string lastName) = customer;可以编译,这是没有意义的;因为他的代码目前无法编译。但如果将方法更改为Deconstruct,那么它就可以编译。 - David Arno
你们两个都是对的。首先,我错误地称呼了Deconstructor方法。但是我试图解构的客户来自外部服务(只是一个演示),这个服务实际上返回一个元组。我以为它返回的是一个Customer对象,所以一直在尝试解构它。 - Milen Kovachev

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