如何在类型中实现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运算符

DirectCast是一个"编译时"强制转换,在运行时添加了类型检查。它用于在类型继承或接口实现发挥作用时进行强制转换。它不会考虑用户定义的强制转换,就像您在这里看到的那样,所以它不适用。

CType是合适的,你应该使用它,而不是试图颠覆语言。它将查找用户定义的转换并应用它们。

就性能而言,CType和这里一样好。因为在您的示例中,类型在编译时是已知的,所以您将获得它的最佳代码


为了解决这个问题:最重要的是,作为一名程序员,你什么都不为DirectCast做,VB.NET什么都做。事实上,除了通过实现特定接口或从基类继承来启动类之外,您不能做任何事情来获得DirectCast

如果要提供任何其他转换,则使用CType。这是两者之间的根本分歧。DirectCast会自动出现,您无法修改其行为。CType将允许您通过提供自定义转换来扩展其行为。

因此,总结一下:要么你的类从一个类型继承,在这种情况下,实例的DirectCast与该基类型之间的关系是有效的,要么它不起作用,在那种情况下,你需要创建自己的CType覆盖。