Здравствуйте, jul_nevermind, Вы писали:
_>Как привести в замешательство C# программиста на собеседовании? А, например, вот так.
А зачем приводить в замешательство C#-программиста? И кому на фиг нужно знать особенности компиляторов? Знание на практике бесполезное. Ну, разве что меньше надо на компилятор надеяться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Должен ли out-параметр быть проинициализирован до возврата из метода?
Здравствуйте, Shmj, Вы писали:
S>Просьба написать наиболее краткий пример, на котором видна проблема — не хочется читать простыню — не настолько важный вопрос.
// Project1.csprojusing Library;
namespace Sample
{
public sealed class ValueProvider
{
public bool TryGetValue(out Result result)
{
// Expected: The out parameter 'result' must be assigned to before control leaves the current methodreturn false;
}
}
}
// Project2.csprojnamespace Library
{
public readonly struct Result
{
public object Value { get; }
//public readonly object Value; // 2. Works as expected
//public readonly int Value; // 3. Works as expected
}
}
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Должен ли out-параметр быть проинициализирован до возврата из метода?
Здравствуйте, varenikAA, Вы писали:
AA>но в своем коде лучше out не использовать. будь то анонимный кортеж или структура/класс.
Почему не использовать, если с out проверка и деконструкция получаются проще и без промежуточных разыменований?
AA>без кастов не обойтись если метод возвращает кошек и собак, хоть с out, хоть с return.
Пример был про возврат неполиморфных типов, как и более 95% использования Try-паттерна в BCL. А если бы метод возвращал кошек и собак, то в твоих ADT-over-OOP было бы два каста — от IResult<IAnimal> к Some<IAnimal>, и от IAnimal к Cat.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Должен ли out-параметр быть проинициализирован до возврата из метода?
Здравствуйте, VladD2, Вы писали:
VD>А зачем приводить в замешательство C#-программиста? И кому на фиг нужно знать особенности компиляторов? Знание на практике бесполезное. Ну, разве что меньше надо на компилятор надеяться.
Странное поведение в целом, и себе жизнь на ровном месте усложнили, и других в замешательство приводят
Здравствуйте, Qbit86, Вы писали:
Q>На C# там определение ATD. А использование ATD там на F#.
Понял, не любите F#
Повторюсь, есть функция она и должна возвращать значение, try использовали вынужденно из-за отсутствия в сишарпе кортежей,
void, out, new затрудняют композицию вычислений.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Должен ли out-параметр быть проинициализирован до возврата из метода?
Здравствуйте, varenikAA, Вы писали:
AA>Здравствуйте, jul_nevermind, Вы писали:
_>>Как привести в замешательство C# программиста на собеседовании? А, например, вот так.
AA>Зачем вообще использовать возвращаемые параметры если есть return?
Потому что туплы появились совсем недавно, а заводить отдельный возвращаемый тип на каждый чих — лениво было.
Здравствуйте, varenikAA, Вы писали:
AA>Зачем вообще использовать возвращаемые параметры если есть return?
Out-параметры позволяют синтаксически изображать что-то похожее на деконструкцию кортежей и совмещать с проверкой, довольно удобно. Это стандартный Try-паттерн в .NET. Например:
if (foo.TryGetBar(out Bar bar, out string explanation))
bar.Qux();
else
Console.WriteLine($"Failed to get bar: {explanation}");
Здравствуйте, Qbit86, Вы писали:
Q>Out-параметры позволяют синтаксически изображать что-то похожее на деконструкцию кортежей и совмещать с проверкой, довольно удобно. Это стандартный Try-паттерн в .NET.
Поэтому система типов должна быть богаче, например такая:
match res with
| Ok s -> s
| Error desc -> failWith desc
Здравствуйте, Qbit86, Вы писали:
Q>Исходный контекст был про C#.
Согласен, просто код на сишарпе был бы длинней и не такой выразительный, но там кода не так много по сути нужен базовый абстрактный класс и два наследника.
Здравствуйте, Qbit86, Вы писали:
Q>И получить на ровном месте лишние аллокации и даункасты? Нет, спасибо.
Согласен, в случае BCL от этого наследия уже никуда не деться, но в своем коде лучше out не использовать. будь то анонимный кортеж или структура/класс.
без кастов не обойтись если метод возвращает кошек и собак, хоть с out, хоть с return.
Здравствуйте, Qbit86, Вы писали:
Q>Почему не использовать, если с out проверка и деконструкция получаются проще и без промежуточных разыменований?
в случае если возвращаем ссылочный тип, достаточно проверки на null(неудача).
AA>>без кастов не обойтись если метод возвращает кошек и собак, хоть с out, хоть с return.
Q> А если бы метод возвращал кошек и собак, то в твоих ADT-over-OOP было бы два каста — от IResult<IAnimal> к Some<IAnimal>, и от IAnimal к Cat.
Думаю одного достаточно: https://gist.github.com/altbodhi/4da039522a3bd3cff76f1d68077fbb4e
Здравствуйте, varenikAA, Вы писали:
AA>в случае если возвращаем ссылочный тип, достаточно проверки на null(неудача).
А если не ссылочный? Если дженерик?
Q> А если бы метод возвращал кошек и собак, то в твоих ADT-over-OOP было бы два каста — от IResult<IAnimal> к Some<IAnimal>, и от IAnimal к Cat. AA>Думаю одного достаточно: https://gist.github.com/altbodhi/4da039522a3bd3cff76f1d68077fbb4e
Не понял, к чему этот гист, если речь шла: 1) про твоих кошек и собак, 2) про использование в C#.
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, varenikAA, Вы писали:
Q>А если не ссылочный? Если дженерик?
ну тогда кортеж (bool, T)
Q>Не понял, к чему этот гист, если речь шла: 1) про твоих кошек и собак, 2) про использование в C#.
1) TValue может быть любой хоть кошкой хоть собакой
2) Там как раз C#
3) Вариантов масса, и out один из них только все равно считаю нужен признак успешности, потому что особенно стремно когда out из void метода,
то ли он отработал, то ли нет.
Здравствуйте, varenikAA, Вы писали:
AA>ну тогда кортеж (bool, T)
Тогда ты не сможешь совместить и деконструкцию, и проверку в одном выражении.
AA>1) TValue может быть любой хоть кошкой хоть собакой
Так ты ж сам писал выше: «без кастов не обойтись если метод возвращает кошек и собак, хоть с out, хоть с return.»
AA>2) Там как раз C# :)
На C# там определение ATD. А использование ATD там на F#.
Давай лучше не надо ссылаться на гисты, а вставлять код в собощение. Потому что мы обсуждаем, очевидно, разные гисты. Я вижу только тот, на который ты привёл ссылку. А не тот, в котором есть пример использования на C#.
Повторю для надёжность baseline, с которым будем сравнивать альтернативы:
if (foo.TryGetBar(out Bar bar, out string explanation))
bar.Qux();
else
Console.WriteLine($"Failed to get bar: {explanation}");
AA>3) Вариантов масса, и out один из них только все равно считаю нужен признак успешности
В стандартном Try-паттерне из метода возвращается bool — признак успешности. Именно поэтому можно вызов поместить в if.