1. C# / Говнокод #11912

    +139

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 11 Октября 2012

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

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

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

          http://ideone.com/WQzev

          Таким образом, вы делаете switch по структуре.
          Ответить
      • Это даже в рамки женской логики не вписывается.
        Разве что придумают какой-то Not A Bool but Shit
        Ответить
        • Nullable — это костыль, созданный для работы Linq to SQL, какая в нем должна быть логика?
          Ответить
          • >это костыль, созданный для работы Linq to SQL
            Всё верно. Снова LINQ, снова костыли.
            >какая в нем должна быть логика?
            Тернарная!
            Ответить
            • Она там и есть. True, false и maybe. And maybe can be anything.
              Ответить
              • >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, см. комментарий снизу.
            Ответить
            • А. Я понял.
              http://reflector.webtropy.com/default.aspx/4@0/4@0/untmp/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/System/Nullable@cs/1305376/Nullable@cs
              Но тудa окроме true, false и null ничего не запишешь, когда T is bool.
              internal T value;
              ...
                     public override bool Equals(object other) {
                          if (!HasValue) return other == null;
                          if (other == null) return false;
                          return value.Equals(other);
                      }
              Ответить
    • в дефолте и возвращать "null" четвертого тут быть не может
      Ответить

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