类型不等价,你得到 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 它永远无法使用它。您缺少的是可能发生的更复杂的示例,您可以在自定义类型上定义隐式运算符等。