我有以下代码。我没有为此委托指定任何通用参数和 IN/OUT(方差)。如果我正确理解不变性的含义,我应该无法返回基本类型的对象,因为我的委托提到了对象的返回类型。
我对不变性的理解是错误的吗?
class Program
{
public delegate object SampleDelegate(Base b);
static void Main(string[] args)
{
List<Base> listBases = new List<Base>(){new Base{}, new Base{}};
SampleDelegate newDel = new SampleDelegate(ProcessBase);
newDel(new Base() { });
Console.ReadLine();
}
public static Base ProcessBase(Base b)
{
return b;
}
public class Base
{
}
public class Derived : Base
{
}
}
如果我正确理解不变性的含义,我应该无法返回基本类型的对象,因为我的委托提到了对象的返回类型。我对不变性的理解是错误的吗?
由于您可以编译并运行该程序,因此您已经知道该问题的答案。是的。
让我们问你想问的问题:
由于委托甚至不是通用的,因此显然对委托的通用差异不适用。那么为什么我可以从返回的方法进行协变转换Base
到要求方法返回的委托类型object
?
显然,通用协方差不是相关的协方差。这里有一个完全不同的规则。这种转换首先在 C# 2.0 中被允许。当从方法组 to a delegate,从方法组中选择的方法可能具有比委托的返回类型更通用的返回类型,前提是这两种类型都是引用类型。对于参数类型也是如此,它们是逆变的。
允许使用引用类型构造的泛型委托类型之间进行转换的功能同样是协变和逆变的,这一功能是由我顺便添加到 C# 4.0 中的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)