Circumvent类型系统用于投射通用类型

时间:2012-07-21 01:01:48

标签: c# generics casting

C#不允许我将类型T转换为我可以证明T的类型。如何将T投射到该类型?

public static T _cast<T> (object o) {
    if (typeof(T) == typeof(string)) {
        return (T) o.ToString(); // Compiler YELLS!
    }
    throw new InvalidCastException("missing compiler generated case");
}

我正在编写一个程序,用于生成从C ++到C#的代码。我希望使用此_cast操作代替C ++的operator T ()

4 个答案:

答案 0 :(得分:3)

通常我不回答我自己的问题,但我刚刚提出了解决方案:转发到object,然后转向T

public static T _cast<T> (object o) {
    if (typeof(T) == typeof(string)) {
        return (T)(object) o.ToString();
    }
    throw new InvalidCastException("missing compiler generated case");

}

答案 1 :(得分:3)

我认为比双重演员更优雅的解决方案是使用as关键字。像这样:

return o.ToString() as T;

我没有尝试过,但是编译器应该没有问题,因为当它无法将字符串强制转换为T时它将返回null,这在你的条件中它当然不会。< / p>

答案 2 :(得分:0)

没有从String转换为其他所有类型。编译器告诉你它不知道如何做你所问的。如果您提供有关您尝试做的更多细节,也许有人可以提供一些建议。

答案 3 :(得分:0)

强制转换和解析之间存在差异。我想你想要的是尝试解析字符串

int stringToNum = (int)"123";  //will not compile

int stringToNum2 = int.Parse("123");