Próbuję rzucić contravariant delegata, ale z jakiegoś powodu mogę to zrobić tylko za pomocą operatora "as".Mogę rzucić tylko contravariant delegata z "jak"
interface MyInterface { }
delegate void MyFuncType<in InType>(InType input);
class MyClass<T> where T : MyInterface
{
public void callDelegate(MyFuncType<MyInterface> func)
{
MyFuncType<T> castFunc1 = (MyFuncType <T>) func; //Error
MyFuncType<T> castFunc2 = func as MyFuncType<T>;
MyFuncType<T> castFunc3 = func is MyFuncType<T> ? (MyFuncType<T>)func : (MyFuncType<T>)null; //Error
}
}
castFunc2 działa dobrze, ale castFunc1 i castFunc3 powodować błąd:
Cannot convert type 'delegateCovariance.MyFuncType<myNamespace.MyInterface>' to myNamespace.MyFuncType<T>'
The MSDN article on the as operator stany że castFunc2 i castFunc3 są "równoważne", więc nie rozumiem, jak tylko jeden z nich może spowodować błąd. Innym elementem, który wprowadza mnie w błąd, jest to, że zmiana MyInterface z interfejsu na klasę pozwala pozbyć się błędu.
Czy ktoś może mi pomóc zrozumieć, co się tutaj dzieje? Dzięki!
Kompiluje się dobrze dla mnie tutaj: http://ideone.com/5SjUxV Czy brakuje mi czegoś? (nie najbardziej znany z ideałem). Otrzymuję określony błąd, jeśli usunę "in" z deklaracji 'MyFuncType'. –
hmm. Pomyślałem, że być może nie dostałeś erros, ponieważ ideone używa mono, ale próbowałem używać mono z visual studio i wciąż dostaję błędy. – rob
@rob Użyłem kierowania monofonicznego .Net 4 i nie otrzymałem błędów. Którą wersją środowiska .Net kierujesz? –