我对铸造有一个疑问。
public void Test(out T a, out T b)
{
object d,e;
d = 10;
e = 35;
Console.WriteLine(d.GetType());
a = (T)d;
b = (T)e;
}
这里d.getType()将返回System.int32。所以我的问题是为什么我们不能直接编码像=(T)10; 我没有得到正确的帮助。请帮忙。 感谢。
答案 0 :(得分:8)
投射不起作用。 T需要是System.int32的子类或超类才能在没有任何额外的运算符重载的情况下进行转换。
我假设T是int的某种包装器。您需要创建一个函数或构造函数来将int
转换为T
。这与铸造不一样。
您可以定义自己的explicit运算符,它将为您执行此转换,语法将与您拥有的相同。但你仍然需要自己定义转换。
这样的事情:
public static explicit operator T (int original) {
T t = new T();
t.value = original;
return t;
}
答案 1 :(得分:2)
假设这是针对类型为T的泛型类,问题是为什么它会以一种方式而不是另一种方式失败?
由于 d 是一个对象,(T)d
表示取消装箱操作而不是强制转换。拆箱在运行时完成,因此无法进行编译。我想如果类型 T 不是int,那么此步骤将在运行时失败。
另一方面,(T)10
是一个转换操作 - 在编译时进行类型检查。如果你在T和int之间没有一个强制转换操作符(如Welbog的回答中所述),则无法编译。