在下面的自定义类型中实现CType
运算符时,使用DirectCast
运算符无法使用类型:
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文档 here :
DirectCast不使用Visual Basic运行时帮助程序 转换,因此它可以提供比CType更好的性能 转换为数据类型对象时的转换。
如何在 C#或 Vb.Net 中实施?
答案 0 :(得分:2)
DirectCast
是一个'编译时'强制转换,在运行时添加了类型检查。它适用于在类型继承或接口实现正在进行时进行转换。
它不会考虑用户定义的演员表,例如你在这里,所以它不适用。
CType
是合适的,您应该使用它,而不是试图颠覆语言。它将查找用户定义的转换并应用它们。
在性能方面,CType
和它在这里一样好。因为在您的示例中编译时已知类型,所以您将获得最佳代码。
解决注释:主要的是,作为程序员,你不为DirectCast
做任何事情,VB.NET会做所有事情。实际上,除了通过实现特定接口或从基类继承而启动类之外,不能做任何事情来获得DirectCast
。
如果您想提供任何其他转化,请使用CType
。这是两者之间的根本分歧。 DirectCast
自动出现,您无法修改其行为。 CType
允许您通过提供自定义转换来扩展其行为。
总而言之:要么你的类继承了一个类型,在这种情况下{1}}一个实例进出该基类型,或者它没有,在这种情况下你需要创建自己的{ {1}}覆盖。