跳到主要内容

如果类C为类P的子类,并定义了委托delegate void(c args),同时关联了一个这样的方法void M(P args),这叫逆变还是协变 ?

参考答案:

在C#中,逆变(contravariance)和协变(covariance)通常用于泛型接口、委托和方法中,以允许在类型参数方面更灵活的操作。

逆变允许将派生类(更具体的类型)的对象赋值给基类(更一般的类型)的引用,而协变允许将基类(更一般的类型)的对象赋值给派生类(更具体的类型)的引用。

在你给出的例子中,类C是类P的子类,并且定义了一个委托delegate void D(C args)。同时,你提到关联了一个方法void M(P args)。然而,这个场景本身并不直接涉及到逆变或协变的概念。

委托delegate void D(C args)声明了一个接受C类型参数的委托,而方法void M(P args)接受一个P类型的参数。C是P的子类,所以你可以将C类型的对象传递给接受P类型参数的方法,这是正常的多态行为,而不是逆变或协变。

逆变和协变通常用于泛型委托和接口中,比如Action<T>Func<T, TResult>的泛型版本,或者自定义的泛型接口和委托。在这些情况下,逆变允许你将委托或接口的方法参数类型从更具体的类型更改为更一般的类型(即,从派生类到基类),而协变允许你将返回类型从更一般的类型更改为更具体的类型(即,从基类到派生类)。

然而,在你给出的具体例子中,并没有使用泛型委托或接口,也没有涉及到类型参数的逆变或协变。因此,这个场景本身并不属于逆变或协变的范畴。