从泛型转换为泛型

本文关键字:泛型 转换 | 更新日期: 2023-09-27 17:51:15

简而言之,我试图让这段代码工作:

class it<X>
{
    X[] data;
    int pos;
    public Y get<Y>()
    {
        return (Y) data[pos];
    }
}

基本上,我有许多不同原语的数组,需要作为不同的原语在另一个地方处理。前一种代码无法编译,因为编译器不知道X和Y是什么。然而,下面的代码可以:

    public Y get<Y>()
    {
        return (Y) (object) data[pos];
    }
然而,我得到运行时异常,如:
InvalidCastException: Cannot cast from source type to destination type.
it[System.Double].get[Single]()

看起来很傻,因为c#显然有浮点数和双精度(以及其他原语)之间的强制转换。我猜这与装箱之类的东西有关,但我对c#很陌生,所以我真的不知道——我想我已经习惯了c++模板。注意,X和Y之间的转换总是存在的——我能告诉编译器这个吗?

从泛型转换为泛型

您可以使用ConvertChangeType -方法:

public Y get<Y>()
{
    return (Y)Convert.ChangeType(data[pos], typeof(Y));
}

在类和方法中添加一些泛型约束,以确保只能传递原语,这可能也是一个好主意:

class it<X> where X : struct
public Y get<Y>() where Y : struct