none
Nullable bool RRS feed

  • Вопрос

  • Каким должен быть аргумент, чтобы попасть в ветку "default" ?
    private static string f(bool? arg)
    {
        switch (arg)
        {
            case true: return "true";
            case false: return "false";
            case null: return "null";
            default: return "???";
        }
    }

    11 октября 2012 г. 10:40

Ответы

  • switch по строкам это вообще "сахар". В общем, понятно, ответ на вопрос кроется в "глупости" компилятора. Всем спасибо :)
    • Помечено в качестве ответа tulosba 11 октября 2012 г. 12:32
    11 октября 2012 г. 12:27

Все ответы

  • а попробуйте там до свитча (ну или где-нибудь) просто написать var ttt = default(bool?);
    и посмотрите чему будет равно ttt и тип и значение.
    точку отладочную поставьте.

    Подозреваю null будет.


    • Изменено INFEL8 11 октября 2012 г. 11:12
    11 октября 2012 г. 11:08
  • а попробуйте там до свитча (ну или где-нибудь) просто написать var ttt = default(bool?);
    и посмотрите чему будет равно ttt и тип и значение.
    точку отладочную поставьте.

    default(bool?) будет ветка null.
    11 октября 2012 г. 11:13
  • ну да, конечно.
    если дефолт совпадает с тем что есть в касе,
    то и попадёт в касю.
    и то и то равно null, значит в дефолт ни когда не попадёт,
    (то есть при любом аргументе дефолт останется не при делах).
    если с бряками не поиграться. (при случае отсутсвия ретурнов прямо там)

    // А вообще в дефолт попадает если ни в какую касю не пришло.
    // Как бы по умолчанию.
    // А Вы перебрали все 3 возможные варианта, дефолту ни чего не осталось.



    • Изменено INFEL8 11 октября 2012 г. 11:51
    • Предложено в качестве ответа YatajgaEditor 11 октября 2012 г. 11:57
    • Отменено предложение в качестве ответа tulosba 11 октября 2012 г. 12:17
    11 октября 2012 г. 11:50
  • Вобщем Вы тут все возможные варианты перебрали, поэтому и нет нужды в default. "А Вы перебрали все 3 возможные варианта, правда почему-то без бряков, что мне пока не очень понятно." - в данном случае нет нужды, так как происходит возврат значея и выход из функции. Можете написать более выразительно, хотя результат будет тот же.

    private static string f(bool? arg)
        {
          switch (arg)
          {
            case true: return "true";
            case false: return "false";
          }
          return "null";
        }

    11 октября 2012 г. 11:57
    Модератор
  • про возвраты я не сразу заметил )
    11 октября 2012 г. 12:01
  • Почему тогда ошибка компиляции "Error 3 'f(bool?)': not all code paths return a value", если убрать строку с веткой default? Т.е. компилятор не может понять, что в switch и так перебраны все возможные варианты?
    11 октября 2012 г. 12:16
  • Потому что он не настолько "умный", чтобы перебирать все значения. В данном случае их три, а если это будет не bool, а string, например, то перебрать всё не получится, так как вариантов бесконечно много. Поэтому я предложил код высше.
    11 октября 2012 г. 12:19
    Модератор
  • switch по строкам это вообще "сахар". В общем, понятно, ответ на вопрос кроется в "глупости" компилятора. Всем спасибо :)
    • Помечено в качестве ответа tulosba 11 октября 2012 г. 12:32
    11 октября 2012 г. 12:27
  • я обычно на такое делаю не из свитча ретурн,
    а после него.
    переменную создаю, а в касях уже присваиваю ей значение.
    потом после выхода из свитча в ретурн отправляю созданную переменную.
    11 октября 2012 г. 12:32
  • Это уже кому как нравится. Единственная или множественные точки выхода из функции - известный holywar.
    11 октября 2012 г. 12:46
  • за то ошибки бы не было,
    и сразу про дефолт понятно
    11 октября 2012 г. 13:24