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

long? i = 10000;
int? s = i as int?;

为什么它给我一个空s变量?我知道使用它进行转换int? s = (int?)i;可以正常工作,但为什么我不能使用as运算符?


有只小跳蛙
浏览 167回答 3
3回答

慕雪6442864

来自MSDN:该代码等价于以下表达式,只是表达式变量仅计算一次。expression is type ? (type)expression : (type)null  由于i is int?是 falseas关键字将返回(int?)null。

Cats萌萌

类型不等价,你得到 null,这就是as工作原理但是,您可以直接Castlong? 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 它永远无法使用它。您缺少的是可能发生的更复杂的示例,您可以在自定义类型上定义隐式运算符等。

catspeake

编译器无法将“long”隐式转换为“int”根据 MSDNas 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而不是引发异常。ref: as (C# 参考)因此,使用您的代码,无法进行转换,因为返回 Null。
打开App,查看更多内容
随时随地看视频慕课网APP