VS2017 RC compiler bug - NRE in switch
От: hi_octane Беларусь  
Дата: 22.12.16 09:09
Оценка: 82 (3) :)
Продолжаю работать сапёром (первый баг в СВ
Автор: hi_octane
Дата: 14.12.16
) для коллег которые вдруг решат заиспользовать 2017 RC на реальном проекте, как это случайно сделал я Тем кто только собирается перейти на 2017-ю совет — не повторяйте моих ошибок, ищите свои подождите хотя-бы RC 4

Простенькая программа ниже внезапно валится с NRE!, источник которого в осмысленном коде можно найти только с декомпилятором.
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp2017
{
    class Program
    {
        class A
        {
        }
        
        static void Main(string[] args)
        {                           
            var dummy = new List<int>();

            switch((object)new A())
            {
                case A a:
                    {
                        dummy.Any(x => a != null);
                    }
                    break;
            }
        }
    }
}


P.S. Бойцам из рослина в github зарепортил.
vs2017
Re: VS2017 RC compiler bug - NRE in switch
От: hardcase Пират http://nemerle.org
Дата: 26.12.16 09:35
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>P.S. Бойцам из рослина в github зарепортил.


Шта? Паттернматчинг на синтаксисе switch? И что, всем нравится писать break?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: VS2017 RC compiler bug - NRE in switch
От: hi_octane Беларусь  
Дата: 26.12.16 09:51
Оценка:
H>Шта? Паттернматчинг на синтаксисе switch? И что, всем нравится писать break?
Та не паттерн матчинг там а сахар для as/is, моё древнее предсказание о том как MS поймёт что такое ПМ и что в итоге слепит
Автор: hi_octane
Дата: 22.11.15
сбылось с точностью 100%
Re[2]: VS2017 RC compiler bug - NRE in switch
От: Sinix  
Дата: 26.12.16 10:11
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Шта? Паттернматчинг на синтаксисе switch? И что, всем нравится писать break?

Для эстетов будет match expression

Ну а какие ещё варианты-то? Лепить точно такой же case, только без break?
Re[3]: VS2017 RC compiler bug - NRE in switch
От: ionoy Эстония www.ammyui.com
Дата: 26.12.16 13:56
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, hardcase, Вы писали:


H>>Шта? Паттернматчинг на синтаксисе switch? И что, всем нравится писать break?

S>Для эстетов будет match expression

А когда он будет то? Я что-то отстал от жизни.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[4]: VS2017 RC compiler bug - NRE in switch
От: Sinix  
Дата: 26.12.16 14:24
Оценка:
Здравствуйте, ionoy, Вы писали:

I>А когда он будет то? Я что-то отстал от жизни.

В восьмом шарпе. Если опять ничего не поменяется, конечно.
Отредактировано 26.12.2016 14:28 Sinix . Предыдущая версия .
Re: VS2017 RC compiler bug - NRE in switch
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.12.16 16:57
Оценка: +2
Здравствуйте, hi_octane, Вы писали:

Чего то я окончательно разочаровался в новой студии. Глюки какие то совершенно непонятные. К примеру, периодически что то портит в шелле, в результате при открытии некоторых солюшенов вылетает. Причем как сама, так и 2015. Люсьена при компиляции начинает сыпать какими то левыми ошибками при парсинге запросов. TeamCity до сих пор не поддерживает новый msbuild, прописанные в нугет-пакетах для tools файлы исчезают в неизвестном направлении. А главное — как то особо новые фичи пока не пригождаются.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[2]: VS2017 RC compiler bug - NRE in switch
От: Sinix  
Дата: 26.12.16 18:36
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

AVK>Чего то я окончательно разочаровался в новой студии. Глюки какие то совершенно непонятные.


Это ещё фигня. Судя по репликам со стороны людей, которые завязаны на инфраструктуру студии — у них там лица от фейспалмов опухли. Только по msbuild:
Документация? Не, не слышали. Топик — отличный пример того, как не надо работать с техническим долгом в проекте. Проблема ещё летом известна была.
Совместимость? Я вас не знаю.
Матчасть? Да зачем?
Dogfooding? Ну, вы поняли.

Подобные ошибки вполне объяснимы в альфе и с натяжкой — в первых бетах проекта, но никак не в RC. В общем что-то мне не нравится новомодный MS. Можно завернуть немножко старого доброго кговавого энтерпрайза с скучными релизами раз в два года?
Re[3]: VS2017 RC compiler bug - NRE in switch
От: hardcase Пират http://nemerle.org
Дата: 26.12.16 19:37
Оценка:
Здравствуйте, Sinix, Вы писали:

H>>Шта? Паттернматчинг на синтаксисе switch? И что, всем нравится писать break?

S>Для эстетов будет match expression

Похоже что это и будет самый удобный способ — уйма последовательных if-else-if.

S>Ну а какие ещё варианты-то? Лепить точно такой же case, только без break?


Да хотябы break сделать необязательным, что ли, — это же употеть можно их выписывать.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: VS2017 RC compiler bug - NRE in switch
От: Sinix  
Дата: 26.12.16 19:50
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Похоже что это и будет самый удобный способ — уйма последовательных if-else-if.

Не, полноценный PM обещают с ADT в комплекте. Что в switch, что в match.

S>>Ну а какие ещё варианты-то? Лепить точно такой же case, только без break?


H>Да хотябы break сделать необязательным, что ли, — это же употеть можно их выписывать.

Ну тогда получается совсем новый диалект шарпа. Впрочем, нынче у нас проверенные временем грабли уже не аргумент, так что всё может быть.
Re[5]: VS2017 RC compiler bug - NRE in switch
От: hardcase Пират http://nemerle.org
Дата: 26.12.16 21:50
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Не, полноценный PM обещают с ADT в комплекте. Что в switch, что в match.


Пожуем-увидим.

H>>Да хотябы break сделать необязательным, что ли, — это же употеть можно их выписывать.

S>Ну тогда получается совсем новый диалект шарпа. Впрочем, нынче у нас проверенные временем грабли уже не аргумент, так что всё может быть.

Диалекта не получится. Хвостовой break в case секциях никакой семантической нагрузки не несет — перескакивать с секции на секцию можно только оператором goto.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: VS2017 RC compiler bug - NRE in switch
От: licedey  
Дата: 27.12.16 05:05
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, hi_octane, Вы писали:


AVK>Чего то я окончательно разочаровался в новой студии. Глюки какие то совершенно непонятные. К примеру, периодически что то портит в шелле, в результате при открытии некоторых солюшенов вылетает.


Оглашаю весь список пожалуйста.
Re[6]: VS2017 RC compiler bug - NRE in switch
От: Sinix  
Дата: 27.12.16 05:40
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Диалекта не получится. Хвостовой break в case секциях никакой семантической нагрузки не несет — перескакивать с секции на секцию можно только оператором goto.


Ну тут как, или диалект, или нечто в духе php/пёрла с десятью способами записи одного и того же. Что хуже —

Ну серьёзно, нравится вот такая разносортица?
  Скрытый текст
    class Program
    {
        class A
        {
            private const int Default = 2;
            private int field;

            public int Prop1 { get { return field; } }

            public int Prop2A { get; set; }
            public int Prop2B { get; set; } = Default;
            public int Prop2C { get; private set; }
            public int Prop2D { get; private set; } = Default;

            public int Prop3A { get; }
            public int Prop3B { get; } = Default;

            public int Prop4A => field;
            public int Prop4B => field = Default;

            /*public int Prop5 // c#8
            {
                get => field;
            }*/
        }

        class B/*(int prop6 = 123)*/ // records, c# 8
        {
            // emitted by compiler:
            /*public int Prop6 { get; } = prop6;*/
        }

        // Что выведет? ; )
        static void Main(string[] args)
        {
            var a = new A { Prop2A = 10 };
            a.Prop2B *= a.Prop4B;
            /* a = a with { Prop2A = 30 }; */ // c# 8

            var x = a.Prop1;
            var y = new Random().NextDouble() > 0.5 ? 1 : throw new ArgumentNullException();
            (var z, var z1) = ((((x, y)), x), y).Item1;
            var z2 = new { z.Item1, z1 }.Item1;
            if (!(z2 is var z3)) { }
            var z4 = z3;
            var z5 = Z5();
            var z6 = z4;
            Console.WriteLine(z6); 

            int Z5() => z4 <<= 10;
        }
    }

Шесть способов объявить свойство (вместе с парой из c#8). Горшочек, не вари.
Re[3]: VS2017 RC compiler bug - NRE in switch
От: vorona  
Дата: 27.12.16 09:08
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Та не паттерн матчинг там а сахар для as/is, моё древнее предсказание о том как MS поймёт что такое ПМ и что в итоге слепит
Автор: hi_octane
Дата: 22.11.15
сбылось с точностью 100%


Eric Lippert

The first time I saw the “pattern matching” feature proposal for C# I was really impressed by how the designers managed to take a feature usually associated with functional languages like OCaml or Haskell, and make it feel like it was a natural extension to C# rather than something grafted on.

Re[7]: VS2017 RC compiler bug - NRE in switch
От: hardcase Пират http://nemerle.org
Дата: 04.01.17 14:58
Оценка: +2
Здравствуйте, Sinix, Вы писали:

S>Шесть способов объявить свойство (вместе с парой из c#8). Горшочек, не вари.


Там все же не одно и то же с объявлением свойств.
Единственный WTF возник на коде:

public int Prop4B => field = Default;
/* иЗвиНите зА неРовнЫй поЧерК */
Re[8]: VS2017 RC compiler bug - NRE in switch
От: Sinix  
Дата: 04.01.17 16:10
Оценка:
Здравствуйте, hardcase, Вы писали:

S>>Шесть способов объявить свойство (вместе с парой из c#8). Горшочек, не вари.

H>Там все же не одно и то же с объявлением свойств.
Не одно и тоже, но избыточность таки есть.

H>Единственный WTF возник на коде:

public int Prop4B => field = Default;

А побочные эффекты от local-методов, throw as expression, "if (x is var y)" и nested tuples значит, не смущают?
Re[9]: VS2017 RC compiler bug - NRE in switch
От: hardcase Пират http://nemerle.org
Дата: 04.01.17 16:48
Оценка:
Здравствуйте, Sinix, Вы писали:

S>А побочные эффекты от local-методов, throw as expression, "if (x is var y)" и nested tuples значит, не смущают?


Локальными функциями, throw выражениями и кортежами меня не напугать. C# по форме постепенно приближается к Nemerle.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: VS2017 RC compiler bug - NRE in switch
От: Sinix  
Дата: 04.01.17 19:21
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Локальными функциями, throw выражениями и кортежами меня не напугать. C# по форме постепенно приближается к Nemerle.


Как бы да, только шарп не N и добавляемые фичи смотрятся весьма чужеродно. Они в принципе не вписываются в дизайн шарпа, т.к. не решают никакой общей проблемы, а являются костылями к частным моментам.

* Тюплы нужны только для перетоптаться до появления record types. После этого пользы от них никакой (да, .Deconstruct() планируется и для record-ов).
* Local methods имеют ровно один относительно полезный сценарий: проверка предусловий для async-методов / итераторов. Остальные примеры использования, что попадались — сплошь попытки оформить лапшекод в виде кучи локальных методов. Лучше он от этого особо не становился.
* История throw as expression вообще характерна для нынешнего шарпа. Добавлен как заглушка для match expression, без него
var x = enumerable switch
(
  case T[] array: array.Length,
  case ICollection<T> collection: collection.Count,
  case *: throw new NotSuppottedException()
)

не работал. Соблюдая традицию, match expression к седьмому шарпу не успел.

И как неприятный бонус, свежедобавленные фичи порождают кучу побочных эффектов, типа условий "if (x is null) { }", утекания out var-переменных, или проверок в стиле
arg = arg ?? throw new ArgumentNullException(nameof(arg));


В общем, шарп всё больше напоминает минное поле в стиле js/perl, чем "язык без ошибок", каким он изначально задумывался.
Re[11]: VS2017 RC compiler bug - NRE in switch
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.17 02:44
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>* Тюплы нужны только для перетоптаться до появления record types. После этого пользы от них никакой (да, .Deconstruct() планируется и для record-ов).


Deconstruct уже сейчас работает для любого типа с соотв. методом.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[12]: VS2017 RC compiler bug - NRE in switch
От: Sinix  
Дата: 05.01.17 08:36
Оценка: +2
Здравствуйте, AndrewVK, Вы писали:

S>>* Тюплы нужны только для перетоптаться до появления record types. После этого пользы от них никакой (да, .Deconstruct() планируется и для record-ов).

AVK>Deconstruct уже сейчас работает для любого типа с соотв. методом.
Не, я про то, что в рекордах этот метод будет компилятором генериться. Если ничего не поменяется, конечно.

Т.е. из коробки рекорды будут покрывать все те же сценарии, что и тюплы + никакой чехарды с именами.
Вот фиг его знает, зачем тюплы вообще вводить надо было
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.