【发布时间】:2020-08-16 21:19:21
【问题描述】:
在 C# 中,如果我有一个 object 类型的变量,我如何检查是否可以将其转换为类型 T,这是一个值类型? as 运算符不起作用,因为 T 是一个值类型,而 o.GetType().Equals(typeof(T)) 只是检查 object 是否是 T 类型的装箱变量,但不检查它是否可以强制转换为 T。
【问题讨论】:
-
"...只检查 object 是否是 T 类型的装箱变量,但不检查它是否可以转换为 T。"对于结构,这两件事不是等价的吗?你能举一个
T的例子吗,即o.GetType().Equals(typeof(T))是假的,但你可以把对象转换成T。 -
@user1282931:不,装箱的
double不能转换为float,反之亦然。在 少数 种情况下,您可以转换为不同的类型(例如uint与int或枚举),但一般来说,您只能取消装箱为原始装箱类型。 -
@user1282931 你能像
if (o is double d)一样使用is运算符吗? -
嗯...不,您不能将盒装的
float投射到double。试试object o = 1f; double d = (double)o;。除非你的意思不同? -
@V0ldek:哎呀 - 对于
uint/int的情况,我正在考虑数组。 (C# 编译器不允许您将int[]转换为uint[],但 CLR 很乐意这样做。)它确实仍然适用于拆箱 int vs enum:gist.github.com/jskeet/bbe290432a665937be0a18841d4e1f2c
标签: c#