为了账号安全,请及时绑定邮箱和手机立即绑定

为什么`as`为可空值类型提供null?

为什么`as`为可空值类型提供null?

C#
有只小跳蛙 2022-10-23 15:04:52
long? i = 10000; int? s = i as int?;为什么它给我一个空s变量?我知道使用它进行转换int? s = (int?)i;可以正常工作,但为什么我不能使用as运算符?
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

来自MSDN

该代码等价于以下表达式,只是表达式变量仅计算一次。

expression is type ? (type)expression : (type)null  

由于i is int?是 falseas关键字将返回(int?)null


查看完整回答
反对 回复 2022-10-23
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

类型不等价,你得到 null,这就是as工作原理


但是,您可以直接Cast


long? i = 10000;

var s = (int?)i;


// or even better make sure its *checked* 


var s = checked((int?)i);

为什么这行得通?

C# 语言规范 11.6.1 可空转换

...

基于从 S 到 T 的基础转换评估可空转换的过程如下:

  • 如果可以为的转换是 fromS?T?

  • 如果源值为 null(HasValue属性为false),则结果为nulltype 的值T?

  • 否则,转换被评估为从to的展开,然后是从to的基础转换,然后是从to的包装。S?SSTTT?

...

as不这样做,它检查运行时类型,如果它们不相等则返回 nullT?


其他资源

检查(C# 参考)

checked 关键字用于显式启用整数类型算术运算和转换的溢出检查。

#从评论更新

我知道我们无法转换,为什么我们不能这样做,但为什么他们建议在任何情况下它都会有用,即编译器错误 CS0077的一些随机图像链接“as 运算符必须与引用类型或可为空的类型('int' 是不可为空的值类型)。”

原因是(在您的图像示例中)值类型不能为 null 它永远无法使用它。您缺少的是可能发生的更复杂的示例,您可以在自定义类型上定义隐式运算符等。


查看完整回答
反对 回复 2022-10-23
?
catspeake

TA贡献1111条经验 获得超0个赞

编译器无法将“long”隐式转换为“int”

根据 MSDN

as 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而不是引发异常。

ref: as (C# 参考)

因此,使用您的代码,无法进行转换,因为返回 Null。


查看完整回答
反对 回复 2022-10-23
  • 3 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信