我的要求是获取一个对象的内容并将其强制转换为其他类型。实际上,内容是指向本机C ++类的指针,而dot net对象是允许点网访问C ++的包装器。因此,相同的C ++对象可能具有不同的包装器,具体取决于您正在访问的继承层次结构中的哪个类。而这些包装器没有继承关系。
在VB.net中我可以写。
Dim s1 As Short = 13
Dim l1 As Long = s1
现在我想写,
Dim v1 As ValueTest1 = New ValueTest1(13)
Dim v2 As ValueTest2 = v1
其中ValueTest1和ValueTest2在C ++ / CLI中定义为值类型。所以我在ValueTest1上有一个构造函数,它接受一个ValueTest2,但编译器仍然不支持从ValueTest1到ValueTest2的类型强制。
令人沮丧。
有关如何进行隐式转换的任何建议吗?
确定使用运算符,但使用对象时还有其他问题,
Dim v1 As ValueTest1 = New ValueTest1(13)
Dim v2 As ValueTest2 = v1 ' OK
Dim o1 As Object = v1
Dim v3 As ValueTest2 = o1 ' fails with the exception below
test_xxxxx.dll中出现'System.InvalidCastException'类型的第一次机会异常
其他信息:指定的演员表无效。
答案 0 :(得分:0)
您可以自己定义显式或隐式转换运算符。
// without keyword 'explicit', it's an implicit conversion operator
static operator ValueTest1 ( ValueTest2 two )
{
ValueTest1 one(two.foo, two.bar);
return one;
}
static explicit operator ValueTest2 ( ValueTest1 one )
{
ValueTest2 two(one.foo, one.bar);
return two;
}
有关详细信息,请参阅this page。该页面的重点是从旧的Managed Extensions for C ++迁移到C ++ / CLI,但它确实为C ++ / CLI中的转换运算符提供了语法。