【问题标题】:How to implement the DirectCast operator in a type?如何在类型中实现 DirectCast 运算符?
【发布时间】:2016-02-01 10:22:54
【问题描述】:

在像下面这样的自定义类型中实现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 更好的性能 与数据类型 Object 相互转换时。

如何在 C#Vb.Net 中实现它?

【问题讨论】:

标签: c# .net vb.net casting type-conversion


【解决方案1】:

DirectCast 是一个“编译时”强制转换,在运行时添加了类型检查。它用于在类型继承或接口实现起作用时进行强制转换。 它不会考虑用户定义的强制转换,例如您在此处使用的,因此它不适用。

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

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


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

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

所以总结一下:要么你的类继承自一个类型,在这种情况下,DirectCast 的实例与该基类型之间的工作,或者它不工作,在这种情况下,你需要创建自己的 CType覆盖。

【讨论】:

  • 感谢您的回答,但是对于那些继承自其他类型的类,我该如何应用 DirectCast 实现?我在 MSDN 中没有找到任何示例。再次感谢
  • @ElektroStudios 假设我们有一个 TextBox 实例,但键入为 Control(例如从 Form.Controls 返回),我们想使用特定于 TextBox 的东西,我们可以使用 DirectCast,因为我们真正拥有的是一个文本框(而且我们不会在运行时遇到异常)。 DirectCast 只允许更改变量的“观点”,但实际上什么都不做(TextBox 实例始终保持不变),这(部分)是 DirectCast can 比CType
  • @ElektroStudios 除了 Sehnsucht 已经说过的内容之外,我还尝试在更新我的答案时解决您的评论。
猜你喜欢
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多