Многие из вас, те кто из мира .NET, наверное уже в курсе, что не так давно (месяц назад) Microsoft выпустила Visual Studio 2017 RC, в комплекте с которой разумеется идет C# 7. Что называется на суд энтузиастов. Изучая возможности новой версии, у меня внезапно упала Visual Studio. Каким образом — читайте под катом.
Итак, для воспроизведения бага вам понадобиться Visual Studio 2017 RC. Далее создаем консольное приложение и вставляем этот незамысловатый код:
Для тех кто не понял код, давайте разберемся, что он означает. Здесь используются такие нововведения C# 7 как:
— Tuples — кортежи
— Deconstruction — так и переводиться
Кортежи, скажем так, очередной синтаксический сахар языка.
Раньше было:
Теперь можно:
Учтите, что для использования этой возможности нужно установить сборку System.ValueTuple.
Деконструкция, а точнее деконструкция-декларация или разрушающая декларация (deconstructing declaration) — это возможность разобрать кортеж на переменные, с одновременным их определением.
Например так:
Где метод объявлен таким образом:
Результатом конструкции выше, будет декларация трех новых переменных: first, middle, last, которые вернет метод LookupName как кортеж. Другими словами, кортеж разобъется на три переменных.
Разрушающая декларация применима не только к кортежам, но и к пользовательским классам. Одним условием является определение метода-деконструктора с именем Deconstruct. Как в примере выше. Эта возможность позволяет разбивать объект класса на составные части.
Пример:
Как вы поняли, в результате у нас будет myX=1, myY=2.
Вроде во всем разобрались. Теперь сделайте вдох и разкомментируйте код, который в начале поста.
Фокус удался — студия пропала, тестировщиков наверное уволили, и одним тикетом в дашбоарде разработчиков студии стало больше.
Хотя, справедливости ради, для .NET Core этот код работает. Может это такая хитрая задумка?
В релизе должно быть исправлено, так как в баг репорт отправили до появления поста.
→ Хорошое описание новых возможностей C# 7 можной найти тут (англ.)
UPD: По просьбе хабраюзера Varim в комментариях, я таки нашел место, где Microsoft держит список известных багов в Visual Studio. Описанный в посте баг — здесь.
Итак, для воспроизведения бага вам понадобиться Visual Studio 2017 RC. Далее создаем консольное приложение и вставляем этот незамысловатый код:
class Program
{
class IwillCrash
{
public void Deconstruct(out int x) { x = 0; }
}
static void Main(string[] args)
{
//var (x) = new IwillCrash(); // BOOM! deconstruction feature crashes VS2017 RC
}
}
Для тех кто не понял код, давайте разберемся, что он означает. Здесь используются такие нововведения C# 7 как:
— Tuples — кортежи
— Deconstruction — так и переводиться
Кортежи, скажем так, очередной синтаксический сахар языка.
Раньше было:
Tuple<int, string> MyFunc(Tuple<decimal, long> param)
Теперь можно:
(int, string) MyFunc( (decimal, long) param )
Учтите, что для использования этой возможности нужно установить сборку System.ValueTuple.
Install-Package «System.ValueTuple» -IncludePrerelease
Деконструкция, а точнее деконструкция-декларация или разрушающая декларация (deconstructing declaration) — это возможность разобрать кортеж на переменные, с одновременным их определением.
Например так:
(string first, string middle, string last) = LookupName(id1);
Где метод объявлен таким образом:
(string, string, string) LookupName(long id)
Результатом конструкции выше, будет декларация трех новых переменных: first, middle, last, которые вернет метод LookupName как кортеж. Другими словами, кортеж разобъется на три переменных.
Разрушающая декларация применима не только к кортежам, но и к пользовательским классам. Одним условием является определение метода-деконструктора с именем Deconstruct. Как в примере выше. Эта возможность позволяет разбивать объект класса на составные части.
Пример:
class Point
{
public void Deconstruct(out int x, out int y) { x = 1; y = 2; }
}
(var myX, var myY) = new Point(); // вызывает Deconstruct(out myX, out myY);
Как вы поняли, в результате у нас будет myX=1, myY=2.
Вроде во всем разобрались. Теперь сделайте вдох и разкомментируйте код, который в начале поста.

Хотя, справедливости ради, для .NET Core этот код работает. Может это такая хитрая задумка?
В релизе должно быть исправлено, так как в баг репорт отправили до появления поста.
→ Хорошое описание новых возможностей C# 7 можной найти тут (англ.)
UPD: По просьбе хабраюзера Varim в комментариях, я таки нашел место, где Microsoft держит список известных багов в Visual Studio. Описанный в посте баг — здесь.