Casting和Out参数

时间:2009-07-08 12:19:41

标签: c# casting

我对铸造有一个疑问。

  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; 我没有得到正确的帮助。请帮忙。 感谢。

2 个答案:

答案 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的回答中所述),则无法编译。