Иногда встречается ситуация, когда приходит что то нетипизированное, которое на самом деле известно какого типа. Но обычный каст не очень подходит, потому что выдает не очень понятное исключение. Поэтому приходится писать такое:
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>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Иногда встречается ситуация, когда приходит что то нетипизированное, которое на самом деле известно какого типа. Но обычный каст не очень подходит, потому что выдает не очень понятное исключение. Поэтому приходится писать такое: AVK>
AVK>var typed = untyped as SomeType;
AVK>if (typed == null) throw SomeException("Что то пошло не так");
AVK>// или Debug.Assert(typed != null, "Что то пошло не так")
AVK>
AVK>Ситуация осложняется, если null — валидное значение или требует иной реакции. AVK>Вобщем, хотелось бы упростить жизнь.
Здравствуйте, 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>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Так я как раз и написал сюда, потому что пока не знаю точно как оно выглядеть должно. Реализация то там тривиальная, вопрос в дизайне.
Из того, что уже есть:
var typed = untyped as SomeType;
Code.BugIf(typed == null, "Shit happens");
// orif (!(untyped is SomeType typed))
throw CodeExceptions.InvalidOperation("Shit happens");
// oppa-oppa-hipsta stylevar typed = untyped as SomeType ?? throw CodeExceptions.InvalidOperation("Shit happens");
// + using static CodeExceptions;var typed = untyped as SomeType ?? throw InvalidOperation("Shit happens");
Здравствуйте, AndrewVK, Вы писали:
AVK>Первые примеры не сильно отличаются от plain кода, а хипста стайл, увы, требует 7 шарпа.
Ну да. А кто-то ещё сидит на vs 15?
Если серьёзно, то не придумывается хорошего варианта. Практически все выглядят как попытка вставить свой оператор приведения типов.
Причём с седьмым шарпом и паттерн-матчеингом этот оператор перестанет быть нужным целиком и полностью.
Здравствуйте, 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>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Может тогда Code.NotNull сделать дженериком и возвращать значение аргумента?
Он уже generic. В принципе можно, если народ сильно попросит.
Лично моё мнение: резко-резко-резко против. Очень давно нахватался опыта с кодом, в котором проверка предусловий и бизнес-логика были вперемешку.
Особенно после того, как один непризнанный гений (не будем показывать пальцем, но это был я) врубил на некоторых ассертах [Conditional("DEBUG")]
Ну и кроме того, у нас уже есть поддержка подобных вариантов со стороны языка. Точно есть смысл тащить в библиотеку код, который через год-два пригодится только в легаси?