gpt4 book ai didi

c# - 逆变似乎会导致冲突的行为

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

以下例子摘自C# in Depth: What you need to master C# 2 and 3 ,并且似乎只会导致 jskeet 已确定的重大变化,但这是错误的。请解释:

delegate void SampleDelegate(string x);

public void CandidateAction (string x)
{
Console.WriteLine("Snippet.CandidateAction")
}

public class Derived: Snippet
{
public void CandidateAction (object x)
{
Console.WriteLine("Derived.CandidateAction")
}
}
....

Derived x = new Derived();
SampleDelegate factory = new SampleDelegate (x.CandidateAction);
factory ("test");

现在,为什么 SampleDelegate 接受 string 而不是 object 时它应该完全工作。据我所知,对象不是从字符串派生的。恰恰相反。这就是 c# 2.0 下允许的逆变。这似乎证明了相反的效果。

最佳答案

从概念上讲,Derived.CandidateAction 的签名是说,“我可以处理任何你想扔给我的东西。” SampleDelegate 的契约是“你必须能够处理一个字符串”。现在如果一个方法可以处理任何对象,它当然可以处理一个字符串。因此 Derived.CandidateAction 能够满足 SampleDelegate 的需求,因此可以分配给 SampleDelegate 变量。

我在 http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html 上对此进行了更详细的讨论(诚然是从 C# 4 的角度) .

关于c# - 逆变似乎会导致冲突的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/742351/

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