Is there a way to define an implicit conversion operator in VB.NET?
在C中,可以使用隐式关键字定义隐式用户定义的类型转换运算符。
在vb.net中,可以定义一个ctype转换运算符,该运算符将用户定义的类型显式转换为另一个类型。
有没有方法在vb.net中声明隐式转换运算符?
我似乎找不到任何关于这个的信息……
回答
我在Widening操作员的msdn文档中找到了答案。显然,对于隐式转换,CTYPE Widening运算符被"调用",而CTYPE Narrowing运算符被调用,用于显式转换。
起初,我认为这个文档是不正确的,因为我在测试期间遇到了一个异常。我重新测试发现了一些非常奇怪的东西。当使用"="运算符完成隐式强制转换时,作为加宽转换运算符实现的函数可以正常工作。
例如,下面将隐式地将Something类型转换为MyClass类型。它正确调用了我的Widening转换实现,一切正常工作:
1 2
| Dim y As Something
Dim x As MyClass = y |
但是,如果隐式强制转换是在foreach循环中完成的,则它不起作用。
例如,当Something类型在For Each循环中隐式强制转换为MyClass类型时,以下代码将引发异常("无法将‘something’类型的对象强制转换为‘myclass’类型):
1 2 3 4
| Dim anArrayOfSomethingTypes() As Something = getArrayOfSomethings()
For Each x As MyType In anArrayOfSomethingTypes
....
Next |
对此,我们深表感谢。
在VB.NET中使用"create widening CType放映两个隐式转换。
1 2 3 4 5
| Class C1
Public Shared Widening Operator CType(ByVal p1 As C1) As C2
End Operator
End Class |
在对面,一个显式转换,可以做为城市Narrowing插拔Widening以上的定义。
- 也许我不明白扩大和缩小的区别。我已经实现了一个加宽操作符和一个收缩操作符。加宽操作符接受someType的参数并将其转换为myObject的实例。收缩运算符获取MyObject的参数并将其转换为SomeType。我想我真正的问题是"当这两种类型之间发生显式转换时,是否自动使用用户定义的CType运算符?"
- 犯错!!我的意思是含蓄。我的问题是"当这两种类型之间发生隐式强制转换时,是否自动使用用户定义的CType运算符?"(大OOOPS)
- 好的,谢谢你的帮助。我想我跳过了你的第一句话什么的。加宽运算符调用了隐式转换。我找到了我的答案:hehttp://stackoverflow.com/questions/1312549/is-there-a-way-‌&8203;定义一个隐含的‌&8203;t-conversion-operato‌&8203;r-in-vb-net/1312595‌&8203;1312595re:
- 我刚尝试过,但出现了一个错误:无法将"OtherNamespace.Something"类型的对象强制转换为"MyNamespace.MyClass"。
- 显然,在隐式强制转换期间不会自动调用加宽的ctype实现。
- 当我使用ctype方法将something强制转换为myclass(它使用扩展的ctype实现)时,我看不到错误。
- 啊哈!如果隐式强制转换是使用"="完成的,则它会起作用。例如:dim x as myclass=y(其中y是"othernamespace.something")。但是,如果隐式强制转换是在foreach循环中完成的,则不起作用。例如,对于Anarrayofsomethingtypes中的每个x作为mytype…
- 请看我更新的问题。我不明白为什么我看到这种奇怪的行为。