Непонятки с co-/contravariance делегатов и Generics

aleks058


interface I;
class C : I;

void M1<T>(T v)
where T: C
{
}

void M2(C v)
{
}

почему

Act<I> meth1 = M1; // Compilation error
Act<I> meth2 = M2; // Compilation error

?

Alexander08

че за Act? давай весь код?

aleks058

Act из C5 Collections Library.

public delegate void Act<A1>(A1 x1);

Alexander08

у меня и первое не компилицо

aleks058

Решарпер подвёл.
Реально не компилится.
Так вот вопрос. Почему? Товарищи из MS ведь говорили, что ковариантность и контравариантность делегатов теперь есть!

kokoc88

Почему?
M2 принимает конкретную реализацию интерфейса. А в делегат, к которому ты хочешь привести, можно передавать любую реализацию. То есть я наоборот не понимаю, почему это должно компилироваться. :confused:

aleks058

Потому что
1. C : I
2. Это входной параметр функции

kokoc88

class B : I { }
meth2(new B;

Alexander08

вот тебе писча для размышлений
  
namespace GenTest
{
delegate void Act<A1>(A1 x1);
class I { };
class C : I { };

class Program
{
void M1<T>(T v)
where T : I
{
}

void Main2
{
Act<C> meth1 = M1<I>;//yes
Act<I> meth2 = M1<I>;//yes
Act<I> meth3 = M1<C>;//no
Act<C> meth4 = M1<C>;//yes
}

static void Main(string[] args)
{
}
}
}
Оставить комментарий
Имя или ник:
Комментарий: