栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么“ ref”和“ out”不支持多态?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么“ ref”和“ out”不支持多态?

=============

更新:我使用此答案作为此博客条目的基础:

为什么ref和out参数不允许类型变化?

有关此问题的更多评论,请参见博客页面。感谢您提出的重大问题。

=============

让我们假设你有课

Animal
Mammal
Reptile
Giraffe
Turtle
Tiger
,具有明显的子类关系。

现在假设您有一个方法

void M(ref Mammal m)
M
可以读写
m


您可以将类型的变量传递

Animal
M
吗?

否。该变量可以包含

Turtle
,但
M
将假定它仅包含哺乳动物。A
Turtle
不是
Mammal

结论1

ref
不能使参数“更大”。(动物比哺乳动物多,因此该变量变得“更大”,因为它可以包含更多的东西。)


您可以将类型的变量传递

Giraffe
M
吗?

M
可以写入
m
,并且
M
可能要编写一个
Tiger
m
。现在,您已将a
Tiger
放入实际类型为的变量中
Giraffe

结论2

ref
不能使参数“更小”。


现在考虑

N(out Mammal n)

您可以将类型的变量传递

Giraffe
N
吗?

N
可以写
n
,并且
N
可能要写一个
Tiger

结论3

out
不能使参数“更小”。


您可以将类型的变量传递

Animal
N
吗?

好吧,为什么不呢?

N
无法读取
n
,只能写入,对不对?您将a写入
Tiger
类型的变量,
Animal
就已经准备好了,对吧?

错误。规则不是“

N
只能写
n
”。

这些规则是:

1)在正常返回之前

N
必须先写入。(如果抛出,则所有投注均无效。)
n``N``N

2)

N
必须先写入内容,
n
然后才能从中读取内容
n

这允许发生以下一系列事件:

  • 声明一个
    x
    type 字段
    Animal
  • x
    作为
    out
    参数传递给
    N
  • N
    写入一个,
    Tiger
    n
    的别名
    x
  • 在另一个线程,有人写了一
    Turtle
    x
  • N
    试图阅读的内容
    n
    ,并发现
    Turtle
    它认为是类型的变量
    Mammal

显然,我们想使之非法。

结论4

out
不能将参数设为“更大”。


最后得出结论无论是

ref
也不
out
参数可能有所不同它们的类型。否则将破坏可验证的类型安全性。

如果您对基本类型理论中的这些问题感兴趣,请考虑阅读我的有关协方差和反方差如何在C#4.0中工作的系列文章。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576268.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号