2013-04-30 96 views
1

我的需求是获取一个对象的内容并将其强制为不同的类型。实际上,内容是一个指向本地C++类的指针,而dot net对象是允许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的类型强制转换。

令人沮丧。

任何建议如何使它做隐式转换?

OK使用运营商的工作,但有更多的问题,使用对象时,

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

其他信息:指定的转换无效。

回答

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了解更多信息。该页面主要关注从旧的C++托管扩展迁移到C++/CLI,但它确实给出了C++/CLI中转换运算符的语法。

相关问题