如何在类型中实现DirectCast运算符
本文关键字:实现 DirectCast 运算符 类型 | 更新日期: 2023-09-27 18:20:10
在下面这样的自定义类型中实现CType
运算符时,该类型不能使用DirectCast
运算符进行casted:
Public Structure ColorInfo
...
Public Shared Widening Operator CType(ByVal colorInfo As ColorInfo) As Color
Return Color.FromArgb(colorInfo.R, colorInfo.G, colorInfo.B)
End Operator
...
End Structure
另一方面,它可以直接分配给Color
对象,这非常令人困惑:
Dim obj As color = MyColorInfo
然后,我想实现DirectCast
运算符,首先是为了在我的环境中获得打字舒适性(而不是使用CType
),其次是为了获得解释MSDN文档的好处(如果有的话)
DirectCast不使用的Visual Basic运行时帮助程序转换,因此它可以提供比CType更好的性能转换到数据类型Object和从数据类型Object转换时。
如何在C#或Vb.Net中实现它?。
DirectCast
是一个"编译时"强制转换,在运行时添加了类型检查。它用于在类型继承或接口实现发挥作用时进行强制转换。它不会考虑用户定义的强制转换,就像您在这里看到的那样,所以它不适用。
CType
是合适的,你应该使用它,而不是试图颠覆语言。它将查找用户定义的转换并应用它们。
就性能而言,CType
和这里一样好。因为在您的示例中,类型在编译时是已知的,所以您将获得它的最佳代码
为了解决这个问题:最重要的是,作为一名程序员,你什么都不为DirectCast
做,VB.NET什么都做。事实上,除了通过实现特定接口或从基类继承来启动类之外,您不能做任何事情来获得DirectCast
。
如果要提供任何其他转换,则使用CType
。这是两者之间的根本分歧。DirectCast
会自动出现,您无法修改其行为。CType
将允许您通过提供自定义转换来扩展其行为。
因此,总结一下:要么你的类从一个类型继承,在这种情况下,实例的DirectCast
与该基类型之间的关系是有效的,要么它不起作用,在那种情况下,你需要创建自己的CType
覆盖。