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

    +4

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    using System;
    namespace project5
    {
        class Program
        {
            static void Main(string[] args)
            {
             
            }
    
            class Petux
            {
                private int petux = "kukareku!";
                
                public Petux():this(5)
                {
                    
                }
    
                public Petux(int i):this()
                {
                    
                }
            }
    
        }
    }

    обратите внимание на строку 13

    При всем при этом код компилится!

    http://ideone.com/XIQDfK

    Внимание вопрос - уважаемые знатоки, почему?

    Запостил: kegdan, 06 Августа 2015

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

    • обратите внимание на строку 13

      При всем при этом код компилится!

      http://ideone.com/XIQDfK

      Внимание вопрос - уважаемые знатоки, почему?
      Ответить
      • Они хотели быть совместимыми с Б-жественной Матерью Сишкой?
        int petux = "kukareku!";
        printf("Petuh: %d\n", petuh);
        http://ideone.com/0xUW0b
        Ответить
        • Сразу видно, умные люди запиливали.
          Ответить
      • :this(5)
        тоже не плохо
        Ответить
    • ЛАЛ, mono сегфолтнулся от
      Petux p = new Petux(6);
      http://ideone.com/Rk1bkM
      Ответить
      • А что ему остается делать, если переполнился стек? Или в дотнете есть специальный эксепшын на этот счет?
        Ответить
        • В языках с GC не принято сегфотиться.
          Ответить
          • А что будет, если скомпилировать этот код в Visual Studio(tm) и выполнить на винде?
            Ответить
            • Студия не нужна. Это среда разработки. Нужен компилятор:
              C:\Windows\Microsoft.NET\Framework\v4.0. 30319\csc.exe ideone_Rk1bkM.cs
              Компилятор Microsoft (R) Visual C# 2010 версии 4.0.30319.36242
              для Microsoft (R) .NET Framework 4.5
              (C) Корпорация Майкрософт (Microsoft Corp.). Все права защищены.
              
              ideone_Rk1bkM.cs(13,25): warning CS0169: Поле "project5.Program.Petux.petux" никогда не используется


              Запускаем ideone_Rk1bkM.exe:
              Process is terminated due to StackOverflowException.


              И выскакивает окошко с сообщением о неожиданном завершении.
              Ответить
              • Таки-есть эксепшн!
                Ответить
                • Прыщеговно соснуло.

                  Моно на винде можно пользоваться или сырой?
                  Ответить
                  • >> Моно на винде

                    И этот человек утверждает, что он не пидар
                    Ответить
                    • Пидар, ну может я хочу проверить как работает прога под моно, пидар.
                      Ответить
                      • какой самовлюбленный - 3 раза "я" сказал

                        ставь эмуль и проверяй
                        Ответить
                        • >3 раза "я" сказал
                          Сперму с глаз вытри, пидар. Какой эмуль?
                          Ответить
                        • > ставь эмуль и проверяй
                          Этот ваш дох.нет да всё пока никак, впроди как в opensource-ultimate edition вышел. Как его еще не вскомпильнули под ОС?
                          Ответить
                          • Ты про что?
                            Ответить
                            • дох.нет: https://github.com/dotnet/roslyn
                              ОС: http://www.ubuntu.com, https://getfedora.org, https://www.gentoo.org, https://www.opensuse.org, https://www.archlinux.org, тысячи их...
                              Ответить
    • > public Petux():this(5)
      Что это?

      С помощью этого в C# можно инициализировать все параметры подряд? Т.е. для class A { int a,b,c; } this(1,2,3) установит a=1, b=2, c=3?
      Ответить
      • нет, это означает, что перед вызовом этого конструктора вызывается конструктор этого же типа с параметром 5. через base можно вызывать конструктор родительского типа с определенными параметрами
        Ответить
    • http://ideone.com/agr4Ij
      Почему такая модификация не компилится?
      Ответить
      • Читай сообщения об ошибке

        private int kurochka = "kokokoo!";
        Ответить
        • Короче, всё дело в рекурсивных конструкторах. Если в Program добавить такие же конструкторы, как в петухе, то ошибка про курочку исчезнет.
          Ответить
          • и как рекурсивные конструкторы влияют на 13 строку?
            Ответить
            • Мне кажется, внутри компилятора происходит какая-то ошибка при обработке такого кода. Например, он пытается понять, как ему инициализировать данные, и для этого строит зависимость между конструкторами. Зависимость получается циклическая, ну он и решает забить на всю инициализацию.
              Ответить
              • инициализация осуществляется в конструкторах
                class Petux
                        {
                            private int petux = "kukareku!";
                            
                            public Petux()
                            {   
                            }
                        }


                преобразуется к
                class Petux
                        {
                            private int petux;
                            
                            public Petux()
                            {   
                             petux = "kukareku!";
                            }
                        }


                Но! так как 2 раза инициализировать смысла нет, то инициализация не вносится в зависимые конструкторы. А так как тут оба конструктора зависимые - инициализация просто исчезает. И поэтому нет ошибки.

                Кстати в шарпе 6.0 данный код не проканает - ругается на косвенную рекурсию конструкторов
                Ответить
    • Почивший проект Portable.NET (предшественник Mono) не компилирует:
      ideone_Rk1bkM.cs:13: incompatible types in assignment: no conversion from `System.String' to `int'
      Ответить

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