gpt4 book ai didi

c# - C# 4.0 中的协变和逆变推理

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:47:40 24 4
gpt4 key购买 nike

当我们在 C# 4.0 中定义接口(interface)时,我们可以将每个通用参数标记为 inout。如果我们尝试将通用参数设置为 out 并且这会导致问题,编译器会引发错误,不允许我们这样做。

问题:

如果编译器有办法推断协变(out)和逆变(in),为什么我们必须这样标记接口(interface)?仅仅让我们像往常一样定义接口(interface),并且当我们尝试在客户端代码中使用它们时,如果我们尝试以不安全的方式使用它们会引发错误,这还不够吗?

示例:

interface MyInterface<out T> {
T abracadabra();
}
//works OK

interface MyInterface2<in T> {
T abracadabra();
}
//compiler raises an error.
//This makes me think that the compiler is cappable
//of understanding what situations might generate
//run-time problems and then prohibits them.

另外,

在同样的情况下,Java 不也是这样做的吗?据我所知,你只需做类似的事情

IMyInterface<? extends whatever> myInterface; //covariance
IMyInterface<? super whatever> myInterface2; //contravariance

还是我在混合东西?

谢谢

最佳答案

If the compiler has ways of inferring what are valid uses for both covariance (out) and contravariance(in), why do we have to mark interfaces as such?

我不太确定我理解这个问题。我认为您在问两件事。

1) 编译器能否推导出方差标注?

2) 为什么 C# 不像 Java 那样支持调用点差异?

第一个的答案是:

interface IRezrov<V, W> 
{
IRezrov<V, W> Rezrov(IRezrov<W, V> x);
}

我邀请您尝试推断出 V 和 W 上所有合法可能的差异注释。您可能会感到惊讶。

如果您不能为该方法找出唯一的最佳方差注释,您认为编译器为什么可以?

更多原因在这里:

http://blogs.msdn.com/ericlippert/archive/2007/10/29/covariance-and-contravariance-in-c-part-seven-why-do-we-need-a-syntax-at-all.aspx

更一般地说:您的问题表明推理是错误的。廉价地检查解决方案是否正确的能力在逻辑上并不意味着有一种廉价的方法可以找到正确的解决方案。例如,对于两千位素数 p 和 q,计算机可以很容易地验证 p * q == r 是真还是假。这并不意味着取 r 并找到满足等式的 p 和 q 很容易。编译器可以很容易地检查方差注释是正确的还是不正确的;这并不意味着它可以在潜在的数十亿个可能的注释中找到正确的方差注释。

第二个答案是:C# 不是 Java。

关于c# - C# 4.0 中的协变和逆变推理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2733388/

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