|
1
161
企业的价值 更新:我将此答案用作此日志的基础: Why do ref and out parameters not allow type variation? 有关此问题的更多评论,请参阅博客页面。谢谢你的提问。 企业的价值
假设你有课
现在假设你有一个方法
不。该变量可以包含
结论1
:
不。
结论2
:
现在考虑
不。
结论3
:
隐马尔可夫模型。
嗯,为什么不呢?
错了。规则不是”
简单地说,规则是:
1)
2)
这就允许了这一系列事件:
很明显,我们想把它定为非法的。
结论4
:
最后结论
:
既不
如果你对这些基本类型理论的问题感兴趣,可以考虑阅读 my series on how covariance and contravariance work in C# 4.0 . |
|
|
2
28
因为在这两种情况下,您都必须能够为ref/out参数赋值。
如果尝试将b作为引用传递到foo2方法中,并且在foo2中尝试分配a=new a(),那么这将是无效的。
|
|
|
3
9
你正在努力解决经典的OOP问题 协方差 (和反差),见 wikipedia :尽管这一事实可能违背了直观的期望,但在数学上不可能允许用派生类代替基类来替换可变(可分配)参数(以及其项可分配的容器,原因完全相同),同时仍然尊重 Liskov's principle .为什么会这样呢?在现有答案中略图,并在这些维基文章和链接中更深入地探讨了这一点。 OOP语言在保持传统的静态类型安全的情况下看起来是“欺骗”(插入隐藏的动态类型检查,或者需要对所有源进行编译时检查);最基本的选择是:要么放弃这种协方差,接受从业者的困惑(就像C在这里做的那样),要么转向动态类型Approach(作为第一种OOP语言,smalltalk,did)或移动到不可变(单次赋值)数据,就像函数语言一样(在不可变情况下,您可以支持协方差,也可以避免其他相关的难题,例如,在可变的数据世界中不能有方形子类矩形)。 |
|
4
4
考虑:
会违反类型安全 |
|
|
5
2
因为给予
|
|
|
6
1
虽然其他回答已经简洁地解释了这种行为背后的原因,但我认为值得一提的是,如果您确实需要做这种性质的事情,您可以通过将foo2变成一种通用方法来完成类似的功能,例如:
|
|
|
7
0
编译器不是告诉您它希望您显式地强制转换对象以确保您知道您的意图吗?
|
|
|
8
0
从安全的角度讲是有意义的,但是我更愿意编译器给出警告而不是错误,因为通过引用传递的多数学对象是合法使用的。例如
这不会编译,但它能工作吗? |
|
|
9
0
如果您对类型使用实际示例,您将看到:
现在你有了你的功能
祖先
(
即
那可能有什么问题?
你刚刚设法分配了一个
那不好。 与其他人一起重试:
你塞满了
|
|
|
10
0
在我的例子中,我的函数接受了一个对象,我不能发送任何东西,所以我只是做了
那作品 我的foo在vb.net中,它检查内部的类型并执行大量的逻辑操作 如果我的回答是重复的,我道歉,但其他人太长了 |