# C# Language Design Notes for Mar 28, 2017

## Agenda

Design some remaining 7.1 features

1. Fix pattern matching restriction with generics
2. Better best common type


# Fix pattern matching restriction with generics

Today `x as T` is allowed if 

1. there is a reasonable relationship between the left and right type, or
2. one of them is an open type

But for the `is` operator we don't have the second. That means that we can't always replace uses of `as` followed by null check with an `is` with a type pattern.

Also, the restrictions are supposed to rule out only obviously useless cases, whereas some of these are demonstrably useful.

Let's allow it, look again if there are unexpected problems.


# Better best common type

Best common type should combine a value type with null literal to get a nullable value type.

``` c#
b1 ? 1 : b2 ? null : b3 ? 2 : default; // default is 0
b1 ? 1 : b2 ? default : b3 ? 2 : null; // default is null

b1 ? 1 : (b2 ? null : (b3 ? 2 : default)); // default is 0
b1 ? 1 : (b2 ? default : (b3 ? 2 : null)); // default is null
```

This is weird, but fine:

``` c#
M(1, default, null); // int?
```

Next step is trying to spec it. It's a bit complicated.

``` c#
M(myShort, myNullableInt, null); Should continue to infer int? , not short?
```
