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

    0

    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
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    using System;
    
    public class Test
    {
    
        class R { }
        class A : R { }
        class B : R { }
    
        static void pituh(A x, R y){
            Console.WriteLine("A R");
        }
    
        static void pituh(R x, B y){
            Console.WriteLine("R B");
        }
        
       static void pituh(R x, R y){
            Console.WriteLine("R R");
        }
        
        
    
        static void d(R x, R y)
        {
            dynamic a = x;
            dynamic b = y;
            pituh(a, b);
        }
    
        public static void Main(string[] args)
        {
        	d(new A(),new R());
        	d(new A(),new B()); //Runtime error
    	d(new B(),new A()); //Runtime error
    	
        }	
    }

    Пробуем мультиметоды в до-диезе.
    https://ideone.com/Jm5LJA

    Запостил: 3.14159265, 09 Марта 2018

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

    • все правильно
      The call is ambiguous between the following methods or properties: `Test.pituh(Test.A, Test.R)' and `Test.pituh(Test.R, Test.B)'
      Ответить
      • Ну и зачем так жить? Я пишу программу, передаю подходящие типы, она падает в рантайме.
        «все правильно»
        Ответить
        • А если добавить ещё одну перегрузку с (A, B), то её выберет или будет ругаться, что не может выбрать из трёх вариантов?
          Ответить
          • Её выберет: https://ideone.com/ef75t6

            Там еще наверняка траблы с множественным наследованием.
            Когда A implements B,C,D то непонятно какой метод выбрать.
            void m(B b)
            void m(C c)
            void m(D d)

            Тот же CLOS по идее должен вызвать B
            Ответить
        • В рантайме она падает через dynamic, который какбы и должен резолвиться в рантайме. Если нужно чтоб падало при компиляции - пиши без динамиков
          Ответить
          • Интересно, каковы реальные юзкейсы использования dynamic (сиречь отказа от compile time стат типизации) в C#?
            Ответить
            • void POST (dynamic content)

              а потом в методе своим любимым сериалайзером его парсить
              Ответить
              • Что такое post? Метод, который вызывается при POSTе в каком-то веб фреймворке?
                Тогда почему не Stream?
                Ответить
                • В будущем можно будет добавить сериалайзер в конфиг эндопоинта и метод пост уже начнет принимать какието аля JObject-ы в dynamic
                  Ответить
                  • почему не получить Object и не скастить его?
                    Ответить
                    • можно писать без var и лямбд
                      можно и без авто гетеров/сетеров и экстеншн методов
                      но с ними удобнее. и тут так-же
                      Ответить
                      • все, понял

                        еще можно делать утиную типизацию: вызываешь метод foo(), и надо он был реализован у аргумента, а конкретный интерфейс наследовать не нужно
                        Ответить
    • Насколько я помню, void d(R x, R y) можно сразу записать как void d(dynamic x, dynamic y)
      Ответить
    • Интересно, можно-ли рассматривать неявно передаваемую ссылку на объект как аргумент?
      Если можно, то в C# есть самый настоящий мультидиспатч без всяких динамиков для вирт. функций.
      И в жабе есть (собссно, он там только такой и есть).

      Но вообще отказываться от стат типизации и пердолиться с dynamic как-то странно. Старый жабоёб/сишарпер сделал бы или visitor или свитч по тайпу
      Ответить

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