[FeatureRequest] Type cast
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.03.17 10:12
Оценка:
Иногда встречается ситуация, когда приходит что то нетипизированное, которое на самом деле известно какого типа. Но обычный каст не очень подходит, потому что выдает не очень понятное исключение. Поэтому приходится писать такое:
var typed = untyped as SomeType;
if (typed == null) throw SomeException("Что то пошло не так");
// или Debug.Assert(typed != null, "Что то пошло не так")


Ситуация осложняется, если null — валидное значение или требует иной реакции.
Вобщем, хотелось бы упростить жизнь.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Отредактировано 14.03.2017 10:12 AndrewVK . Предыдущая версия .
Re: [FeatureRequest] Type cast
От: Lexey Россия  
Дата: 14.03.17 14:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Иногда встречается ситуация, когда приходит что то нетипизированное, которое на самом деле известно какого типа. Но обычный каст не очень подходит, потому что выдает не очень понятное исключение. Поэтому приходится писать такое:

AVK>
AVK>var typed = untyped as SomeType;
AVK>if (typed == null) throw SomeException("Что то пошло не так");
AVK>// или Debug.Assert(typed != null, "Что то пошло не так")
AVK>


AVK>Ситуация осложняется, если null — валидное значение или требует иной реакции.

AVK>Вобщем, хотелось бы упростить жизнь.

Примеры использования можешь написать?
"Будь достоин победы" (c) 8th Wizard's rule.
Re[2]: [FeatureRequest] Type cast
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.03.17 14:37
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Примеры использования можешь написать?


Так я как раз и написал сюда, потому что пока не знаю точно как оно выглядеть должно. Реализация то там тривиальная, вопрос в дизайне.
Если в лоб, то как то так:
var typed = untyped.Cast<SomeType>("Shit happens");
...
var typed = untyped.CastNotNull<SomeType>("Shit happens", "Null not allowed");
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Отредактировано 14.03.2017 14:38 AndrewVK . Предыдущая версия .
Re[3]: [FeatureRequest] Type cast
От: Sinix  
Дата: 14.03.17 15:46
Оценка: 5 (1)
Здравствуйте, AndrewVK, Вы писали:

AVK>Так я как раз и написал сюда, потому что пока не знаю точно как оно выглядеть должно. Реализация то там тривиальная, вопрос в дизайне.



Из того, что уже есть:
var typed = untyped as SomeType;
Code.BugIf(typed == null, "Shit happens");

// or
if (!(untyped is SomeType typed))
  throw CodeExceptions.InvalidOperation("Shit happens");


// oppa-oppa-hipsta style
var typed = untyped as SomeType ?? throw CodeExceptions.InvalidOperation("Shit happens");
// + using static CodeExceptions;
var typed = untyped as SomeType ?? throw InvalidOperation("Shit happens");
Re[4]: [FeatureRequest] Type cast
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.03.17 15:50
Оценка:
Здравствуйте, Sinix, Вы писали:

Первые примеры не сильно отличаются от plain кода, а хипста стайл, увы, требует 7 шарпа.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[5]: [FeatureRequest] Type cast
От: Sinix  
Дата: 14.03.17 16:00
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Первые примеры не сильно отличаются от plain кода, а хипста стайл, увы, требует 7 шарпа.


Ну да. А кто-то ещё сидит на vs 15?
Если серьёзно, то не придумывается хорошего варианта. Практически все выглядят как попытка вставить свой оператор приведения типов.
Причём с седьмым шарпом и паттерн-матчеингом этот оператор перестанет быть нужным целиком и полностью.
Re[6]: [FeatureRequest] Type cast
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.03.17 18:10
Оценка:
Здравствуйте, Sinix, Вы писали:

AVK>>Первые примеры не сильно отличаются от plain кода, а хипста стайл, увы, требует 7 шарпа.

S>Ну да. А кто-то ещё сидит на vs 15?

А решарпер тем временем в последних ЕАР предлагает переделать проверку в таком вот хипстерском стиле.
Может тогда Code.NotNull сделать дженериком и возвращать значение аргумента?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[7]: [FeatureRequest] Type cast
От: Sinix  
Дата: 23.03.17 18:51
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Может тогда Code.NotNull сделать дженериком и возвращать значение аргумента?

Он уже generic. В принципе можно, если народ сильно попросит.


Лично моё мнение: резко-резко-резко против. Очень давно нахватался опыта с кодом, в котором проверка предусловий и бизнес-логика были вперемешку.
Особенно после того, как один непризнанный гений (не будем показывать пальцем, но это был я) врубил на некоторых ассертах [Conditional("DEBUG")]

Ну и кроме того, у нас уже есть поддержка подобных вариантов со стороны языка. Точно есть смысл тащить в библиотеку код, который через год-два пригодится только в легаси?
Отредактировано 23.03.2017 18:52 Sinix . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.