我遇到了一个问题,我认为我有解决办法,但找不到任何人告诉我我是对还是错?请参阅以下C#中的示例:
public void Test(float number)
{
object myObj = number;
//Here is where I don't know what the correct way to do this is?
// int newNumber = (int)myObj;
// int newNumber = (int)(float)myObj;
// int newNumber = (int)(double)myObj;
}
结果必须确保不会发生类型异常。有什么想法吗?
答案 0 :(得分:1)
第二种选择是正确的。
首先,您将unbox的价值投射到最初装箱的确切类型(即float
)。{
然后,您将float
转换为int
。
答案 1 :(得分:1)
由于盒装值的类型为float
,因此您需要首先将其强制转换为float
,因为它需要取消装箱:
int newNumber = (int)(float)myObj;
如果您想知道 double 施放的原因,您可以从这些问题中找到更多信息:
答案 2 :(得分:1)
我们试试吧......
//int newNumber = (int)myObj;
//InvalidCastException: Specified cast is not valid.
int newNumber = (int)(float)myObj; // works! newNumber is 2
//int newNumber = (int)(double)myObj;
//InvalidCastException: Specified cast is not valid.
如果你有这样的boxed numeric value并希望通过强制转换来转换它,则必须先将其转换为 exact 类型(在本例中为float
),然后再转换它是兼容的类型(在这种情况下,int
)。
如果您事先不知道它是float
,但您确实知道它可以转换为int
,那么您应该使用Convert.ToInt32
,这将有效{ {1}}是myObj
,float
等
double
答案 3 :(得分:1)
根据您的测试,您不知道盒装值的类型,然后我避免任何双重投射(因为对于第一个,您总是需要要知道确切的类型)。
有一个类可以使用转换,让我们尝试使用它:
int number = Convert.ToInt32(myObj, null);
实际上,这与普通演员有很大的不同,它会执行以下操作:
int number = ((IConvertible)myObj).ToInt32(null);
区别在于如何执行舍入。 Cast将截断你的数字(因此1.7将变为1),而转换将执行舍入(因此1.7将变为2)。
如果你知道它是一个浮点数(但你不知道,如果double
或float
)那么我&# 39; d建议首先转换为double
然后转换:
int number = (int)Convert.ToDouble(myObj, null);