2017-01-30 10 views
7

私は私のクラスのために、次のdeconstructorsを宣言することができます。C#7.0でデコンストラクタをオーバーロードすることは可能ですか? 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; 
    } 
} 

私はあなたがデコンストラクタの異なるオーバーロードを持つことができるようにdesconstructorで私たちの変数を使用しての代わりに、直接タプルを返すという考え方があるとし。しかし、私はオブジェクトを3つの変数に分解することはできないようです。私は2つの変数に分解することしかできません。

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

そして、私はこのエラーを取得:

例えば、これはコンパイルされません " '3' 変数に '2' の要素のタプルを分解できない"

しかし、これはないと動作します:

(string firstName, string lastName) = customer; 

私は何をしないのですか?

+1

異なる構造のパラメータと異なる種類のメソッドで、「Deconstruct」メソッドをオーバーロードすることができます。 –

+6

「これはコンパイルされませんが、これはします」と言うとき、違いは何ですか? 2つのコードは私と100%同じです。 –

+1

これは本当のコードであれば助けになります。問題があなたの 'Deconstruct'メソッドに間違った名前を使用したということだけでないかぎりですか? –

答えて

3

Deconstructではなく、Deconstructorというメソッドを呼び出しました。また、2つのタプルでfirstNamelastNameを再宣言することはできません。これらの変更を行うと、以下のコード行がすべてコンパイルされます。

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

そして、拡張によって、彼はコンパイラエラーがあると言いますので、より多くのことが間違っている必要があります。 –

+2

@ LasseV.Karlsen、彼の主張 '(string firstName、string lastName)= customer;'コンパイルは意味をなさない。彼のコードが現在立っているのでコンパイルされません。メソッドが 'Deconstruct'に変更された場合、それはコンパイルされます。 –

+0

あなたはどちらも正しいです。最初に私はDeconstructorというメソッドを誤って呼びました。しかし、私が解体しようとしている顧客も、外部サービス(デモだけ)から来ており、実際にこのサービスはタプルを返します。そして私はそれがCustomerオブジェクトを返すと思って、それを解体しようとしていました。 –

関連する問題