gpt4 book ai didi

c# - C#中委托(delegate)的协变/不变/逆变

转载 作者:太空宇宙 更新时间:2023-11-03 17:41:20 25 4
gpt4 key购买 nike

我有以下代码。我没有为此委托(delegate)指定任何通用参数和 IN/OUT(variance)。如果我正确理解不变性的含义,我应该无法返回 Base 类型的对象,因为我的委托(delegate)提到了对象的返回类型。

我对不变性的理解是错误的吗?

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
{
}
}

最佳答案

If I understand the meaning of invariance correctly i should not be able to return object of Base type since my delegate mentions return type of object. Is my understanding of invariance wrong?



由于您可以编译和运行该程序,因此您已经知道该问题的答案。是的。

让我们问你想问的问题:

Since the delegate is not even generic, clearly generic variance on delegates does not apply. Why then can I make a covariant conversion from a method returning Base to a delegate type that requires that the method return object?



显然,通用协方差不是相关的协方差。这里有一个完全不同的规则。在 C# 2.0 中首次允许这种转换。从方法组转换为委托(delegate)时,从方法组中选择的方法的返回类型可能比委托(delegate)的返回类型更通用,前提是这两种类型都是引用类型。对于逆变的参数类型也是如此。

在 C# 4.0 中添加了允许在使用引用类型构造的泛型委托(delegate)类型之间进行转换以类似地是协变和逆变的特性——顺便说一句,我是这样的。

关于c# - C#中委托(delegate)的协变/不变/逆变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20870183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com