Многие из вас, те кто из мира .NET, наверное уже в курсе, что не так давно (месяц назад) Microsoft выпустила Visual Studio 2017 RC, в комплекте с которой разумеется идет C# 7. Что называется на порку энтузиастам. Не хотел бы вдаваться в подробности, о политике Microsoft в отношении скорости выпуска версий своих продуктов. Поэтому читайте под катом короткую заметку о том, как раняется студия используя новую возможность C# 7.
Итак, для воспроизведения бага вам понадобиться 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) = GetPoint(); // вызывает Deconstruct(out myX, out myY);
Как вы поняли, в результате у нас будет myX=1, myY=2.
Вроде во всем разобрались. Теперь зажмурьтесь и разкоментите код. Фокус удался — студия пропала, тестировщиков уволили, и одним тикетом в дашбоарде разработчиков студии стало больше.
Остается удивляться, как они проморгали, что студия падает от новой возможности языка на простейшем кейсе.
Хотя, справедливости ради, для .NET Core этот код работает. Может это такая хитрая задумка?
Еще один список новых возможностей C# 7
По поводу этого бага есть обсуждение на RSDN’е
ссылка на оригинал статьи https://habrahabr.ru/post/317804/
Добавить комментарий