Esta respuesta es para elborar mis pensamientos sobre este interesante problema. No es una respuesta real, sino una contribución a toda la discusión que es demasiado pequeña para un comentario normal.
yo nos registramos un par de cosas, esta interfaz:
namespace DifferentAssemblyNamespace
{
public interface IBar
{
event Action<dynamic> OnSomeEvent;
}
}
y su implementación:
// 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; }
}
}
nunca funcionará, parece que una regla es exclusión de la otra regla necesaria.
pero .. si llamamos a los genéricos en busca de ayuda, y el uso de un parámetro Tipodynamic
en lugar de utilizar directamente como:
namespace DifferentAssemblyNamespace
{
public interface IGenericBar<T>
{
event Action<T> OnSomeEvent;
}
}
y su aplicación.
// 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; }
}
}
por alguna razón podemos construir (como debe ser) y ejecute:
/** does build **/
IGenericBar<dynamic> f = new Foo3<dynamic>();
f.OnSomeEvent += new Action<dynamic>(f_OnSomeEvent);
parece que el parámetro de tipo hace algo extra que el compilador es feliz.
No estoy seguro de lo que está pasando, por lo que me gustaría saberlo también.
supuesto, altamente hipotética (quizás basura)
pero actualmente pongo mi granito de arena en la comparación de los tipos no debe ser realizar a través de Agregar/Quitar descriptores de acceso en la lista enlazada que contiene el objetivo/métodos del evento.
apuesto que el compilador cae sobre el problema que no puede garantizar lo dinámica es en el montaje externo, por lo tanto no puede determinar si un elemento ya está en la lista o no, lo que es necesario añadir o eliminarlos . (implementación de la interfaz Por lo tanto explícita)
todos sabemos que es sólo algunas de un objeto atribuido pero todavía parece que necesita un paso adicional donde se garantiza cierta de tipo fuerte, y eso es lo T hace , en tiempo de compilación.
/supuesto, altamente hipotética (quizás basura)
Me pregunto cómo el compilador sabría cómo proteger anulando y luego reconocer qué hacer con dinámica al compilar los proyectos separados unos de otros. –
¿Hay algo que configurar para que la implementación explícita de la interfaz funcione? Obtengo un 'error CS0682: 'ConsoleApplication1.MyInterface.ClassLibrary1.IMyInterface.OnSomeEvent' no puede implementar 'ClassLibrary1.IMyInterface.OnSomeEvent 'porque no es compatible con el error de idioma' que intenta compilar. –
@Simon: ¿Qué versión del compilador de C# estás usando? Dynamic se introdujo en C# 4. –