Cette réponse est à elborate mes pensées sur cet intéressant problème. Pas une vraie réponse, mais une contribution à l'ensemble de la discussion qui est trop petit pour un commentaire normal.
J'ai vérifié un peu les choses, cette interface:
namespace DifferentAssemblyNamespace
{
public interface IBar
{
event Action<dynamic> OnSomeEvent;
}
}
et sa mise en œuvre:
// 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; }
}
}
ne fonctionnera jamais, semble qu'une règle est à l'exclusion de l'autre nécessaires à la règle.
mais.. si nous appelons de médicaments pour l'aider, et l'utilisation d'un paramètre de Type, au lieu d'utiliser dynamic
directement avec:
namespace DifferentAssemblyNamespace
{
public interface IGenericBar<T>
{
event Action<T> OnSomeEvent;
}
}
et sa mise en œuvre.
// 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; }
}
}
pour une raison quelconque, nous pouvons construire (comme il se doit) et exécutez:
/** does build **/
IGenericBar<dynamic> f = new Foo3<dynamic>();
f.OnSomeEvent += new Action<dynamic>(f_OnSomeEvent);
semble que le Paramètre Type fait quelque chose de plus que le compilateur est heureux avec.
Je ne suis pas sûr de ce qui se passe, donc je voudrais savoir en tant que bien.
l'hypothèse, hautement hypothétique (peut-être de la merde)
mais actuellement, j'ai mis mes deux cents sur
la comparaison des types il doit y avoir
fait via l'ajout/suppression de accesseurs en
la liste, qui détient le
cible/méthodes de l'événement.
Je parie
que le compilateur tombe sur la
problème qu'il ne peut pas garantir que
dynamique est à l'extérieur de l'assemblée, ne peut donc pas déterminer si un élément est déjà dans la liste ou pas, ce qui est nécessaire pour les ajouter ou les supprimer.(D'où explicite de l'implémentation de l'interface)
Nous savons tous que c'est juste une partie d'un
attribué objet, mais il semble encore
qu'il a besoin d'une étape supplémentaire où certains
fort-type est garanti, et c'est
ce T n'a, au moment de la compilation.
/ hypothèse, hautement hypothétique (peut-être de la merde)