我在 MSDN 上读到,C# 中的 "is" 关键字的等效物应该是 dynamic_cast,但这并不真正等价:它不能用于值类型或泛型参数。例如,在 C# 中我可以写:
void MyGenericFunction<T>()
{
object x = ...
if (x is T)
...;
}
如果我尝试使用“等效”的C++/CLI:
generic<class T>
void MyGenericFunction()
{
object x = ...
if (dynamic_cast<T>(x))
...;
}
我遇到了一个编译器错误 "error C2682: cannot use 'dynamic_cast' to convert from 'System::Object ^' to 'T'"。
我唯一能想到的方法是使用反射技术:
if (T::typeid->IsAssignableFrom(obj->GetType()))
有没有更简单的方法来做这件事?
as
对于值类型也不起作用:dynamic_cast
是as
的确切等价物。将值类型强制转换使用safe_cast
。语义与C#相同:对于向值类型的不良转换,抛出异常;对于引用类型的不良转换,返回null
。 - Alexandre C.