Я пытался создать общее событие. В основном это должно выглядеть следующим образом:EventHandlers and Covariance
namespace DelegateTest
{
class Program
{
static void Main(string[] args)
{
var lol = new SomeClass();
lol.SomeEvent += handler;
}
static void handler(object sender, SomeDerivedClass e)
{
}
}
class SomeClass
{
public delegate void SomeEventDelegate<in T>(object sender, T data);
public event SomeEventDelegate<ISomeInterface> SomeEvent;
}
interface ISomeInterface
{
}
class SomeDerivedClass : ISomeInterface
{
}
}
Я хочу, чтобы позволить пользователю передавать любой делегат, который второй параметр является производным от «ISomeInterface.»
"in" указывает на противоречие, не так ли? Это означает, что если API ожидает что-то более общее, вы можете передать ему что-то более конкретное (в моей базе «ISomeInterface» будет общий, и мой «SomeDerivedClass» будет конкретным.) Мне, однако, сообщают мой компилятор что «никакая перегрузка для обработчика методов не соответствует DelegateTest.SomeClass.SomeEventDelegate».
Мне интересно, почему это не работает. Какие проблемы могут быть вызваны, если это так? Или мне что-то не хватает, чтобы он работал?
Заранее спасибо!
См. Http://stackoverflow.com/questions/129453/net-eventhandlers-generic-or-no –
Я думаю, что у вас не может быть одного события для обработки нескольких типов, у вас могут быть только делегаты. Что вы можете сделать, так это изменить обработчик, чтобы вместо этого принять «ISomeInterface», а затем проверить тип отправленного объекта. Или используйте сам интерфейс. http://msdn.microsoft.com/en-us/library/dd469484.aspx – BrunoLM