如何在类型中实现DirectCast运算符?

时间:2015-11-01 12:47:45

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

在下面的自定义类型中实现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 中实施?

1 个答案:

答案 0 :(得分:2)

DirectCast是一个'编译时'强制转换,在运行时添加了类型检查。它适用于在类型继承或接口实现正在进行时进行转换。 它不会考虑用户定义的演员表,例如你在这里,所以它不适用。

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

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

解决注释:主要的是,作为程序员,你不为DirectCast做任何事情,VB.NET会做所有事情。实际上,除了通过实现特定接口或从基类继承而启动类之外,不能做任何事情来获得DirectCast

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

总而言之:要么你的类继承了一个类型,在这种情况下{1}}一个实例进出该基类型,或者它没有,在这种情况下你需要创建自己的{ {1}}覆盖。