Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在类型中实现DirectCast运算符?_C#_.net_Vb.net_Casting_Type Conversion - Fatal编程技术网

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已经说过的话之外,我还试图在更新我的回答时回应你的评论。