# C# Language Design Notes for Jul 12, 2016 ## Agenda Several design details pertaining to tuples and deconstruction resolved. # All or nothing with element names? There's certainly a case for partial names on literals - sometimes you want to specify the names of _some_ of the elements for clarity. These names have to fit names in the tuple type that the literal is being converted to: ``` c# List<(string firstName, string lastName, bool paid)> people = ...; people.Add(("John", "Doe", paid: true)); ``` Do we also want to allow partial names in _types_? Yes we do. We don't have strong arguments against it, and generality calls for it. It's likely that there are scenarios, and not allowing will feel arbitrary. "The `bool` deserves a clarifying name, but the `TypeSymbol` is clear". ``` c# var t = (1, y: 2); // infers (int, int y) (int x, int) t = (1, 2); ``` As a reminder, we distinguish between leaving out the name and explicitly specifying `Item1`, `Item2`, etc. You get a warning if you use `Item1`... in literals if they are not explicitly there in the target type. (Warning)` ``` c# (int, int) t = (Item1: 1, Item2: 2); // Warning, names are lost ``` For the editor experience we imagine offering completion of a named element in the corresponding position of a tuple literal. # ITuple ``` c# interface ITuple { int Size; object this[int i] { get; } } ``` `ITuple` is really an interface for dynamically checking for deconstructability. Whether we should add `ITuple` now depends on whether we think we want to allow recursive patterns to do that, once we add them. We _do_ think we want that. We cannot use an existing collection interface (such as `IReadOnlyCollection`) because we want to be able to distinguish between deconstructable objects and collections (which might one day get their own pattern). It is fine for a class to implement both. `ValueTuple<...>` should of course implement `ITuple`, and the translation of long tuples should work. The Framework team should chime in on the specific shape and names on the interface. Is `ITuple` the right name, or is it too narrow? Is `IDeconstructable` more to the point or is it too long? Should it be `Size` or `Length` or `Count`? # var when var type exists ``` c# class var {} var (x, y) = e; ``` People use this trick to block the use of `var`, and we should let them, even though we disagree with the practice. So even though a type isn't valid in that position, we will let the presence of a `var` type turn this into an error. # var method What if there's a _method_ called `var`? ``` c# ref int var(int x, int y); var(x, y) = e; // deconstruction or call? ``` Here there is no prior art, so we will always interpret the `var` to mean a deconstructing declaration. If you wanted the method call, parenthesize the call or use @.