I love the new C# 7 candy. Some of them I use, some of them I will use rarely. However, there is one I don’t get at all.
Let’s imagine having a login class and a single method with kinda unusual out parameters:
public class Login {
public string UserName { get; set; }
public string Password { get; set; }
public void Deconstruct(out string userName, out string password) {
userName = UserName;
password = Password;
}
}
Normally you would expect to call this method as:
var login = new Login(...);
var userName, var password;
login.Deconstruct(out userName, out password);
With new out variables, this can be written a bit shorter and, in my opinion, more readable:
var login = new Login(...);
login.Deconstruct(out var userName, out var password);
What I wouldn’t expect for the life of me, would be a Tuple-like syntax:
(var userName, var password) = login;
Why?
Because it doesn’t use keyword, it doesn’t use interface, it doesn’t use attribute. Nope, it uses the magic method name. Yep method must be named Deconstruct and have two or more output parameters and the new syntax is yours to abuse.
And this is not me not liking tuples. I would be more than happy if this worked as a normal tuple returned from a more standard method call , e.g.:
(var userName, var password) = login.Deconstruct();
public (string userName, string password) Deconstruct() {
return (UserName, Password);
}
I believe this magic name method is just simply a wrong way to introduce the new features. It is not discoverable, it doesn’t really read well, and it paves path for introduction of other magical method names. Didn’t IDispose and its Dispose() vs Dispose(bool) teach us anything?
I can just hope this single deviant feature among other sensible C# 7 features is just a price we pay for the night Hejlsberg got drunk. And I surely hope he will stay clean for C# 8. :)