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

    +138.9

    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
    public static class Test3
            {
                public delegate object MyDelegate(object o);
                public delegate T MyDelegate<T>(T o);
    
                public static void Run()
                {
                    MyDelegate dlgA = (o) => { return o; };
                    
                    MyDelegate<object> dlgB = (i) => { return i; };
    
                    MyDelegate dlg = ChangeType<MyDelegate>(dlgB);
                }
                static T ChangeType<T>(Delegate dlg)
                {
                    return (T)(object)Delegate.CreateDelegate(typeof(T), dlg.Target, dlg.Method);
                }
            }

    Люблю вкусняшку))

    Запостил: fekrado, 22 Января 2010

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

    • Мда, говницо. непонятно что вообще за нах, а так же кривое применение лямбд
      Ответить
    • суть кто нибудь поясните, не очень разбираюсь в тонкостях C#...
      Ответить
      • И мне. :)
        Ответить
      • К.О.
        MyDelegate и MyDelegate<T> в своих реализациях (08, 10) - тождественность \x.x=x, с одим различием - классы типов, над которыми они определены.

        Очевидно, что ограничение типов MyDelegate более слабые, нежели MyDelegate<T>, а в рассматриваемых релизациях по своим сигнатурам они инвариантны, поэтому трижды глупо привлекать для подобных трансформаций тяжёлый introspection в виде .NET reflection.
        Ответить
    • ger
      Ответить
    • /*пример изменения типа делегата (: Nagg будь добр научи разработчиков C# как надо правильно код писать */
      Ответить
      • а зачем постить примеры... если бы я нашел такое в продакшне, то сразу бы не понял зачем это. а на счет кривого применения, думаю
        MyDelegate dlgA = (o) => { return o; };

        выглядит хуже нежели:
        MyDelegate dlgA = o => o;
        Ответить
        • а вообще MyDelegate<object> к MyDelegate можно было скаставать так: MyDelegate dlg = i = > dlgB(i);
          Ответить
          • Не каст же это, а новый анонимно инстанциированный тип, анонимно инстанцированный инстанс которого в своём .Invoke вызывает dlgB.Invoke своего новообретённого замыканием члена.
            А каст таков:
            MyDelegate dlg = dlgB;
            Ответить
            • ваш каст не сработает. MyDelegate<T> и MyDelegate - 2 разных типа. (даже проверил в vs)
              Ответить
              • Конечно же, поинт в том, что то, что Вы написали далеко не "каст".
                А у меня и .NET нет тут совсем, только ECMA'ы разные ;)

                Может же такое сработать? TI:
                static static  MyDelegateEx {
                  public static MyDelegate Wut(this MyDelegate<object> selfWtf) {
                    return selfWtf;
                  }
                }
                ...
                var dlg = dlgB.Wut();
                Ответить
                • >> static static static
                  static
                  * slffix
                  Ответить
                • static class Program
                      {
                          public delegate void ImTakesJustAnObject(object a0);
                          public delegate void ImGenericLol<T>(T a0);
                          
                          static void Main(string[] args)
                          {
                              ImGenericLol<object> genericAction = o => { };
                              ImTakesJustAnObject objectAction = genericAction.Wut();
                          }
                  
                          public static ImTakesJustAnObject Wut(this ImGenericLol<object> selfWtf)
                          {
                              return new ImTakesJustAnObject(selfWtf);
                          }
                      }


                  семён
                  Ответить
                  • /* Если присмотреться то genericAction.Wut() конкретизован нежели говнокод ChangeType<T> */
                    Ответить
    • вообще, все какаши с
      <- (T)(object)objectFoo

      это волшебный паттерн, который стоит ловить на уровне CI, и ломать билд, пока dev не объяснит на очной ставке, почему так в этом месте написано.
      Ответить
    • Где здесь С++?
      Ответить

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