Этот ответ должен высказать мои мысли об этой интересной проблеме.Не реальный ответ, но вклад во все обсуждение, который слишком мал для обычного комментария .
Я проверил несколько вещей, этот интерфейс:
namespace DifferentAssemblyNamespace
{
public interface IBar
{
event Action<dynamic> OnSomeEvent;
}
}
и его реализация:
// implicit interface implementation
// generates compile error "Explicit interface implementation"
public class Foo1 : IBar
{
private Action<dynamic> foo;
public event Action<dynamic> OnSomeEvent
{
add { foo += value; }
remove { foo -= value; }
}
}
// implicit interface implementation
// generates compile error "Not supported by the language"
public class Foo2 : IBar
{
private Action<dynamic> foo;
event Action<dynamic> IBar.OnSomeEvent
{
add { foo += value; }
remove { foo -= value; }
}
}
никогда не будет работать , кажется, что одно правило исключает другое необходимое правило.
, но .. если мы вызываем дженерики для справки и используем параметр типа вместо использования dynamic
, например:
namespace DifferentAssemblyNamespace
{
public interface IGenericBar<T>
{
event Action<T> OnSomeEvent;
}
}
и его реализация.
// implicit interface implementation
public class Foo3<T> : IGenericBar<T>
{
private Action<T> foo;
event Action<T> IGenericBar<T>.OnSomeEvent
{
add { foo += value; }
remove { foo -= value; }
}
}
дляпо какой-то причине мы можем построить (как следует) и запустить:
/** does build **/
IGenericBar<dynamic> f = new Foo3<dynamic>();
f.OnSomeEvent += new Action<dynamic>(f_OnSomeEvent);
кажется, что параметр типа делает что-то дополнительное , что компилятор доволен.
IЯ не уверен, что происходит, поэтому я хотел бы также знать.
предположение, очень гипотетическое (возможно, дерьмо)
но в настоящее время я ставлюмои два цента при сравнении типов должны быть сделаны через методы добавления / удаления в связанном списке, который содержит target / meсобытия.
Могу поспорить, что компилятор решает проблему, заключающуюся в том, что он не может гарантировать, какая динамика находится во внешней сборке, и поэтому не может определить, есть ли элемент в списке или нет, что необходимо для добавления или удаления их.(Отсюда явная реализация интерфейса)
Мы все знаем, что это всего лишь некоторый атрибутный объект, но все же кажется, что ему нужен дополнительный шаг, когда гарантируется некоторый строгий тип, и именно это делает T при компиляции.время.
/ предположение, весьма гипотетическое (возможно, дерьмо)