3 回答
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);
为什么这行得通?
...
基于从 S 到 T 的基础转换评估可空转换的过程如下:
如果可以为空的转换是 from
S?
到T?
:如果源值为 null(
HasValue
属性为false
),则结果为null
type 的值T?
。否则,转换被评估为从to的展开,然后是从to的基础转换,然后是从to的包装。
S?
S
S
T
T
T?
...
as
不这样做,它检查运行时类型,如果它们不相等则返回 nullT?
其他资源
checked 关键字用于显式启用整数类型算术运算和转换的溢出检查。
#从评论更新
我知道我们无法转换,为什么我们不能这样做,但为什么他们建议在任何情况下它都会有用,即编译器错误 CS0077的一些随机图像链接“as 运算符必须与引用类型或可为空的类型('int' 是不可为空的值类型)。”
原因是(在您的图像示例中)值类型不能为 null 它永远无法使用它。您缺少的是可能发生的更复杂的示例,您可以在自定义类型上定义隐式运算符等。
TA贡献1111条经验 获得超0个赞
编译器无法将“long”隐式转换为“int”
根据 MSDN
as 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而不是引发异常。
ref: as (C# 参考)
因此,使用您的代码,无法进行转换,因为返回 Null。
- 3 回答
- 0 关注
- 166 浏览
添加回答
举报