.NET
Visual Studio
C#
17 December 2016

Баг в Visual Studio 2017 RC при использовании новых возможностей C# 7

Многие из вас, те кто из мира .NET, наверное уже в курсе, что не так давно (месяц назад) Microsoft выпустила Visual Studio 2017 RC, в комплекте с которой разумеется идет C# 7. Что называется на суд энтузиастов. Изучая возможности новой версии, у меня внезапно упала 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.

Вроде во всем разобрались. Теперь сделайте вдох и разкомментируйте код, который в начале поста.

image Фокус удался — студия пропала, тестировщиков наверное уволили, и одним тикетом в дашбоарде разработчиков студии стало больше.

Хотя, справедливости ради, для .NET Core этот код работает. Может это такая хитрая задумка?
В релизе должно быть исправлено, так как в баг репорт отправили до появления поста.

Хорошое описание новых возможностей C# 7 можной найти тут (англ.)

UPD: По просьбе хабраюзера Varim в комментариях, я таки нашел место, где Microsoft держит список известных багов в Visual Studio. Описанный в посте баг — здесь.

-4
17.4k 14
Comments 19
Top of the day