- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 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);
}
}
Nagg 22.01.2010 18:11 # 0
pushkoff 22.01.2010 18:23 # 0
guest 22.01.2010 21:46 # 0
guest 23.01.2010 00:16 # 0
MyDelegate и MyDelegate<T> в своих реализациях (08, 10) - тождественность \x.x=x, с одим различием - классы типов, над которыми они определены.
Очевидно, что ограничение типов MyDelegate более слабые, нежели MyDelegate<T>, а в рассматриваемых релизациях по своим сигнатурам они инвариантны, поэтому трижды глупо привлекать для подобных трансформаций тяжёлый introspection в виде .NET reflection.
fekrado 22.01.2010 22:03 # 0
ParadoX 22.01.2010 22:12 # 0
Nagg 22.01.2010 22:52 # +2
выглядит хуже нежели:
Nagg 22.01.2010 23:21 # 0
guest 22.01.2010 23:34 # 0
А каст таков:
MyDelegate dlg = dlgB;
Nagg 22.01.2010 23:37 # 0
guest 22.01.2010 23:42 # 0
А у меня и .NET нет тут совсем, только ECMA'ы разные ;)
Может же такое сработать? TI:
guest 22.01.2010 23:43 # 0
static
* slffix
guest 22.01.2010 23:56 # −2
семён
ParadoX 23.01.2010 13:54 # 0
guest 23.01.2010 00:03 # 0
это волшебный паттерн, который стоит ловить на уровне CI, и ломать билд, пока dev не объяснит на очной ставке, почему так в этом месте написано.
guest 25.01.2010 12:36 # −2