Mam pewne kłopoty ze zrozumieniem, dlaczego następujący fragment nie daje mi błądGeneric przeszkodą dla działania nie działa zgodnie z oczekiwaniami
public void SomeMethod<T>(T arg) where T : MyInterface
{
MyInterface e = arg;
}
ale ten, który spodziewałbym do pracy ze względu na ogólny Typ ograniczenia
private readonly IList<Action<MyInterface>> myActionList = new List<Action<MyInterface>>();
public IDisposable Subscribe<T>(Action<T> callback) where T: MyInterface
{
myActionList.Add(callback); // doesn't compile
return null
}
daje ten błąd
cannot convert from 'System.Action<T>' to 'System.Action<MyInterface>'
Używam VS2012 sP1 i .NET 4.5.
Może ktoś wyjaśnić, dlaczego ograniczenie to nie pozwala, aby skompilować?
Dlaczego twoja lista jest tylko do odczytu i dlaczego "nowy ILIST"? Czy to jest prawdziwa deklaracja? –
Klasy i delegaci to nie to samo. 'System.Action' reprezentuje funkcję z jednym parametrem typu 'MyInterface' podczas gdy' System.Action 'reprezentuje metodę z parametrem typu' T: MyInterface'. Sygnatury funkcji nie są kompatybilne, nie jest istotne, że 'T' jest pochodną' MyInterface', sygnatura byłaby kompatybilna, gdyby 'T' było dokładnie' MyInterface'. –
@PaoloTedesco przeprasza, jest zrekonstruowany i uproszczony na podstawie innego kodu. Kopiuj/Wklej błąd –