
Photo by Florian Klauer on Unsplash

Today I tried to deconstruct a C# record with properties and I failed.
First, how do you deconstruct a record with positional parameters?
It's as easy like this:
public record Person(
string FirstName,
string LastName
);
var janeDoe = new Person("Jane", "Doe");
var (lastName, firstName) = janeDoe;That's it.
My naïve approach (the record is simplyfied for brevity) to deconstruct a record with properties was like this:
public record Person()
{
public string Firstname { get; init; }
public string Lastname { get; init; }
}Next, I created an instance:
var janeDoe = new Person() { Firstname = "Jane", Lastname = "Doe" };Now I tried to deconstruct it like I would do with the first sample:
var (lastName, firstName) = janeDoe;And I got this compiler error:
$ No 'Deconstruct' method with 2 out parameters found for type 'Person'After reading this error message several times, I got it: the compiler is expecting a method name Deconstruct like this on my Person record type:
public record Person()
{
public string Firstname { get; init; }
public string Lastname { get; init; }
public void Deconstruct(
out string firstName,
out string lastName
) => (firstName, lastName) = (Firstname, Lastname);
}Deconstruction now works as expected:
var (lastName, firstName) = janeDoe;The reason for this issue is quite simple: The C# compiler auto-generates the Deconstruct method when you have a record type with positional parameters but not for record types with properties.