) для коллег которые вдруг решат заиспользовать 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;
}
}
}
}
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, hardcase, Вы писали:
H>>Шта? Паттернматчинг на синтаксисе switch? И что, всем нравится писать break? S>Для эстетов будет match expression
Чего то я окончательно разочаровался в новой студии. Глюки какие то совершенно непонятные. К примеру, периодически что то портит в шелле, в результате при открытии некоторых солюшенов вылетает. Причем как сама, так и 2015. Люсьена при компиляции начинает сыпать какими то левыми ошибками при парсинге запросов. TeamCity до сих пор не поддерживает новый msbuild, прописанные в нугет-пакетах для tools файлы исчезают в неизвестном направлении. А главное — как то особо новые фичи пока не пригождаются.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Чего то я окончательно разочаровался в новой студии. Глюки какие то совершенно непонятные.
Это ещё фигня. Судя по репликам со стороны людей, которые завязаны на инфраструктуру студии — у них там лица от фейспалмов опухли. Только по msbuild:
Документация? Не, не слышали. Топик — отличный пример того, как не надо работать с техническим долгом в проекте. Проблема ещё летом известна была.
Совместимость? Я вас не знаю.
Матчасть? Да зачем?
Dogfooding? Ну, вы поняли.
Подобные ошибки вполне объяснимы в альфе и с натяжкой — в первых бетах проекта, но никак не в RC. В общем что-то мне не нравится новомодный MS. Можно завернуть немножко старого доброго кговавого энтерпрайза с скучными релизами раз в два года?
Здравствуйте, Sinix, Вы писали:
H>>Шта? Паттернматчинг на синтаксисе switch? И что, всем нравится писать break? S>Для эстетов будет match expression
Похоже что это и будет самый удобный способ — уйма последовательных if-else-if.
S>Ну а какие ещё варианты-то? Лепить точно такой же case, только без break?
Да хотябы break сделать необязательным, что ли, — это же употеть можно их выписывать.
Здравствуйте, hardcase, Вы писали:
H>Похоже что это и будет самый удобный способ — уйма последовательных if-else-if.
Не, полноценный PM обещают с ADT в комплекте. Что в switch, что в match.
S>>Ну а какие ещё варианты-то? Лепить точно такой же case, только без break?
H>Да хотябы break сделать необязательным, что ли, — это же употеть можно их выписывать.
Ну тогда получается совсем новый диалект шарпа. Впрочем, нынче у нас проверенные временем грабли уже не аргумент, так что всё может быть.
Здравствуйте, Sinix, Вы писали:
S>Не, полноценный PM обещают с ADT в комплекте. Что в switch, что в match.
Пожуем-увидим.
H>>Да хотябы break сделать необязательным, что ли, — это же употеть можно их выписывать. S>Ну тогда получается совсем новый диалект шарпа. Впрочем, нынче у нас проверенные временем грабли уже не аргумент, так что всё может быть.
Диалекта не получится. Хвостовой break в case секциях никакой семантической нагрузки не несет — перескакивать с секции на секцию можно только оператором goto.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, hi_octane, Вы писали:
AVK>Чего то я окончательно разочаровался в новой студии. Глюки какие то совершенно непонятные. К примеру, периодически что то портит в шелле, в результате при открытии некоторых солюшенов вылетает.
Здравствуйте, 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# 8var 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). Горшочек, не вари.
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.
Здравствуйте, hardcase, Вы писали:
S>>Шесть способов объявить свойство (вместе с парой из c#8). Горшочек, не вари. H>Там все же не одно и то же с объявлением свойств.
Не одно и тоже, но избыточность таки есть.
H>Единственный WTF возник на коде:
public int Prop4B => field = Default;
А побочные эффекты от local-методов, throw as expression, "if (x is var y)" и nested tuples значит, не смущают?
Здравствуйте, 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, чем "язык без ошибок", каким он изначально задумывался.
Здравствуйте, Sinix, Вы писали:
S>* Тюплы нужны только для перетоптаться до появления record types. После этого пользы от них никакой (да, .Deconstruct() планируется и для record-ов).
Deconstruct уже сейчас работает для любого типа с соотв. методом.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
S>>* Тюплы нужны только для перетоптаться до появления record types. После этого пользы от них никакой (да, .Deconstruct() планируется и для record-ов). AVK>Deconstruct уже сейчас работает для любого типа с соотв. методом.
Не, я про то, что в рекордах этот метод будет компилятором генериться. Если ничего не поменяется, конечно.
Т.е. из коробки рекорды будут покрывать все те же сценарии, что и тюплы + никакой чехарды с именами.
Вот фиг его знает, зачем тюплы вообще вводить надо было