Я пытаюсь создать открыть делегат экземпляра для универсального метода интерфейса, но я продолжаю получать исключение NotSupportedException. Вот упрощенный код, который не будет работать:
interface IFoo
{
void Bar<T>(T j);
}
class Foo : IFoo
{
public void Bar<T>(T j)
{
}
}
static void Main(string[] args)
{
var bar = typeof(IFoo).GetMethod("Bar").MakeGenericMethod(typeof(int));
var x = Delegate.CreateDelegate(typeof(Action<IFoo, int>), null, bar);
}
В последней строке выбрано NotSupportedException, "Указанный метод не поддерживается". Для сравнения, универсальный открытый делегат экземпляра отлично работает:
interface IFoo
{
void Bar(int j);
}
class Foo : IFoo
{
public void Bar(int j)
{
}
}
static void Main(string[] args)
{
var bar = typeof(IFoo).GetMethod("Bar");
var x = Delegate.CreateDelegate(typeof(Action<IFoo, int>), null, bar);
}
И также работает закрытый общий делегат:
interface IFoo
{
void Bar<T>(T j);
}
class Foo : IFoo
{
public void Bar<T>(T j)
{
}
}
static void Main(string[] args)
{
var bar = typeof(IFoo).GetMethod("Bar").MakeGenericMethod(typeof(int));
var x = Delegate.CreateDelegate(typeof(Action<int>), new Foo(), bar);
}
Таким образом, рецепт для закрытых общих делегатов и открытых делегатов экземпляра работает отдельно, но не в сочетании. Это начинает выглядеть как ошибка времени выполнения или умышленное упущение. У кого-нибудь есть понимание?