C# 如何在类型中实现DirectCast运算符?
在下面这样的自定义类型中实现C# 如何在类型中实现DirectCast运算符?,c#,.net,vb.net,casting,type-conversion,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 Op
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
另一方面,它可以直接分配给颜色
对象,这非常令人困惑:
Dim obj As color = MyColorInfo
然后,我想实现DirectCast
操作符,首先是为了在我的环境中获得打字舒适感(而不是使用CType
),其次是为了获得解释MSDN文档的好处(如果有的话):
DirectCast不将Visual Basic运行时帮助程序例程用于
转换,因此它可以提供比CType更好的性能
在转换为数据类型对象和从数据类型对象转换时
如何在C#或Vb.Net中实现它?
DirectCast
是一种“编译时”强制转换,在运行时添加了类型检查。它用于在类型继承或接口实现起作用时强制转换。
它不会考虑用户定义的转换,如您在这里,所以它不适用。
CType
是合适的,您应该使用它,而不是试图颠覆语言。它将查找用户定义的转换并应用它们
就性能而言,CType
与这里的一样好。因为在您的示例中,类型在编译时是已知的,所以您将获得最佳代码
针对这一评论:最重要的是,作为一名程序员,您不需要为DirectCast做任何事情,VB.NET可以做任何事情。事实上,除了通过实现特定接口或从基类继承来启动类之外,您不能做任何事情来获得
DirectCast
如果要提供任何其他转换,请使用CType
。这是两者之间的根本分歧DirectCast
自动出现,您无法修改其行为CType
将允许您通过提供自定义转换来扩展其行为
总结一下:要么你的类从一个类型继承,在这种情况下,实例的
DirectCast
可以从基类型继承,要么不可以,在这种情况下,你需要创建你自己的CType
覆盖。考虑TryCast
method@Fabio谢谢你的评论,但是我不喜欢TryCast的行为,因为如果转换失败,它不会引发异常。可能会重复Thanke for answer,但是,对于从其他类型继承的类,如何应用DirectCast实现?。我在MSDN中没有找到任何示例。谢谢again@ElektroStudios假设我们有一个TextBox实例,但键入为控件(例如,从Form.Controls返回),我们希望使用特定于TextBox的东西,我们可以使用DirectCast,因为我们真正拥有的是一个TextBox(不是,我们在运行时会得到一个异常)。DirectCast只允许更改变量的“视点”,但实际上什么都不做(TextBox实例始终保持不变),这就是(部分)DirectCast比CType@ElektroStudios除了Sehnsucht已经说过的话之外,我还试图在更新我的回答时回应你的评论。