从泛型转换为泛型
本文关键字:泛型 转换 | 更新日期: 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之间的转换总是存在的——我能告诉编译器这个吗?
您可以使用Convert
的ChangeType
-方法:
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