C# 将装箱浮点解装箱为整数

C# 将装箱浮点解装箱为整数,c#,boxing,C#,Boxing,我正在准备考试,无意中发现了一个关于装箱/拆箱的问题。 我一直在想,如果我把一个浮子放进盒子里,比如说: float x = 4.5f; object o = x; int z = (int)(float)o; public static void FloorTemperature(float degrees) { object degreesRef = degrees; `xxx` Console.WriteLine(result); } 如果一个用户想要从o返回

我正在准备考试,无意中发现了一个关于装箱/拆箱的问题。 我一直在想,如果我把一个浮子放进盒子里,比如说:

float x = 4.5f;
object o = x;
int z = (int)(float)o;
public static void FloorTemperature(float degrees) {
    object degreesRef = degrees;
    `xxx`
    Console.WriteLine(result);
}
如果一个用户想要从
o
返回一个值类型变量,我必须将其取消绑定到浮点

float y = (float)o;
这将引发异常:

int z = int(o);
如果我想将存储在
o
中的值强制转换为int,我必须先将其取消装箱,然后像这样进行强制转换:

float x = 4.5f;
object o = x;
int z = (int)(float)o;
public static void FloorTemperature(float degrees) {
    object degreesRef = degrees;
    `xxx`
    Console.WriteLine(result);
}
现在我偶然发现了一个问题:

假设您有这样一种方法:

float x = 4.5f;
object o = x;
int z = (int)(float)o;
public static void FloorTemperature(float degrees) {
    object degreesRef = degrees;
    `xxx`
    Console.WriteLine(result);
}
您需要确保应用程序不会在无效转换时引发异常。您应该为
xxx
插入哪个代码段(我认为无效转换是无效的强制转换例外):

(a)
int结果=(int)degreesRef
(b) 
int结果=(int)(float)degreesRef

正确的答案是(a),但在我看来(b)是正确的。你能给我点化一下吗?我错过了什么


亲切的问候

你没有错过任何东西

答案应该是(b),因为:

(a) 由于您试图将
对象
强制转换为
int
,因此引发异常


(b) 是正确的,因为您首先将其强制转换为
float
,然后将其强制转换为
int
,这会对其进行取整,但不会引发异常。

您是否尝试验证
a
是否有效?这看起来很容易测试,实际上看起来应该是
b
。不幸的是,我随身携带的机器上没有安装visual studio:/。或者使用csharppad.com。或者,如果您所在的计算机上有.NET但没有VS,请使用记事本和csc。@JonSkeet谢谢您Jon Skeet,我还不知道csharppad.com。使用那里的外壳,我可以发现,(a)确实是一个无效的演员阵容,(b)工作正常!第一个导致异常。