Си диез / Говнокод #11912 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
private static string f(bool? arg)
{
    switch (arg)
    {
        case true: return "true";
        case false: return "false";
        case null: return "null";
        default: return "???";
    }
}

В продолжение историй про bool-shit. Если строку 8 убрать, то Visual Studio пишет:
"Error 3 'f(bool?)': not all code paths return a value"
Что должно быть в аргументе, чтобы попасть в ветку default?

Запостил: absolut absolut, (Updated )

Комментарии (22) RSS

  • Задай вопрос на SO, посмотрим что на это Липперт выдаст.
    Ответить
  • Дело в том, что bool? - это Nullable<bool>, полноценный объект.

    Соответственно, оцените полет собственной мысли - вы делаете switch по объекту.
    Ответить
      • Абсолютно, за исключением того, что это все-таки не класс, а структура.

        http://ideone.com/WQzev

        Таким образом, вы делаете switch по структуре.
        Ответить
    • Это даже в рамки женской логики не вписывается.
      Разве что придумают какой-то Not A Bool but Shit
      Ответить
      • Nullable — это костыль, созданный для работы Linq to SQL, какая в нем должна быть логика?
        Ответить
        • >это костыль, созданный для работы Linq to SQL
          Всё верно. Снова LINQ, снова костыли.
          >какая в нем должна быть логика?
          Тернарная!
          Ответить
            • >maybe
              И потому она подходит для описания женского образа мыслей.
              В том числе позволяет увязывать взаимоисключающие предикаты в одном истинном высказывании.
              Ответить
              • Да, потому что если получить у maybe value — получится exception.
                Ответить
    • А что минусуете? Там действительно прячется неявный вызов метода Equals(), вряд ли компилятор должен строить какие-либо предположения на этот счет.

      Можно и без всяких nullable, кстати.
      http://ideone.com/ghJjr

      А вот как попасть в ветку default, непонятно. Хотел отнаследоваться от Nullable<bool> и переопределить Equals, но это структура, от структур не наследуются... разве что использовать небезопасный код и записать на место булевой переменной, скажем, 2. Интересно, что будет, кстати.
      Ответить
      • >и записать на место булевой переменной, скажем, 2
        Там обычно стоят !=0
        >и переопределить Equals
        >Интересно, что будет, кстати.
        Бред какой-то.
        Возвращаемый Equals тип boolean. Либо равно, либо нет.
        Ответить
        • В некоторых языках, не будем показывать пальцами, есть такая возможность как generalized boolean. Т.е. возрващается что-нибудь, лишь бы не false. Это нормально, когда все объекты наследуются от true, а "отсутствие" объекта - false.
          Тогда и приведение типов не нарушается, и зачастую можно сократить код для того, чтобы не заменять значение, а прямо его же и вернуть. В такой ситуации equals могло бы возвращать что угодно. Бутдет ли оно приводится к bool или нет - дело принимающей стороны все равно.
          Ответить
          • >Это нормально, когда все объекты наследуются от true
            Объекты? От true?
            Вы какую траву курите?

            >equals могло бы возвращать
            Могло бы. Да это полное говно.
            Вот как есть.
            http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx
            public virtual bool Equals(Object obj)
            Ответить
            • Я вообще про другой язык говорил... И я не знаю, вы конечно может не соглашаться с МакКарти, но мне его позиция в смысле логики и системы типов нравится больше.
              Ответить
          • Теперь по поводу обобщенных булей.
            generalized boolean: object used as a truth value, where the symbol nil represents false and all other objects represent true.
            Суть сего в переводе на реалии шарпа: (obj!=null).
            То бишь ссылка на объект !=0. То о чем я говорил выше.
            Ответить
        • И получается примерно такой код.

          if(nullable.Equals(true)) { }
          else if(nullable.Equals(false)) { }
          else if(nullable.Equals(null)) { }
          else { }

          Последняя ветка else — результат незнания компилятором кишок типа и невозможности оценить покрытие кода.
          Ответить
        • >Возвращаемый Equals тип boolean. Либо равно, либо нет.
          Я хотел всегда возвращать false. Тогда бы мы пришли в ветку default, см. комментарий снизу.
          Ответить
  • в дефолте и возвращать "null" четвертого тут быть не может
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8