.net Decimal.ToDouble Vs CType(x,Double)建议/首选的选项是什么

.net Decimal.ToDouble Vs CType(x,Double)建议/首选的选项是什么,.net,vb.net,casting,double,type-conversion,.net,Vb.net,Casting,Double,Type Conversion,我的目标是将从NumericUpDown控件返回的Decimal转换为Double 我两者都可以用 MyDouble = Convert.ToDouble(MyDecimal) 或 或者,根据MSDNDecimal有一个ToDouble方法,所以我想: MyDouble = MyDecimal.ToDouble 首选/推荐的方法是什么?为什么最后一个选项会为未指定的参数提供错误 请注意问题的第一部分,如果不同类型的对象应该使用不同的转换方法,是否有某个地方(最好是MSDN)可以参考哪种对象/

我的目标是将从
NumericUpDown
控件返回的
Decimal
转换为
Double

我两者都可以用

MyDouble = Convert.ToDouble(MyDecimal)

或者,根据MSDN
Decimal
有一个
ToDouble
方法,所以我想:

MyDouble = MyDecimal.ToDouble
首选/推荐的方法是什么?为什么最后一个选项会为未指定的参数提供错误


请注意问题的第一部分,如果不同类型的对象应该使用不同的转换方法,是否有某个地方(最好是MSDN)可以参考哪种对象/要求的方法的信息?

就效率而言,CType不是最好的。 使用Convert.ToDouble()更受欢迎,因为它通常效率更高

如上所述,.ToDouble是一个共享方法,因此您必须:

    Dim test As Decimal = 2.22
    Dim myDouble As Double

    myDouble = Convert.ToDouble(test)

    myDouble = Decimal.ToDouble(test)
上述任一方法都可用于更改类型。

可能值得一读的是(转换函数、CType、DirectCast和System.Convert部分)

你的问题的答案是“视情况而定”。例如,它在该页上声明

生成的确切方法调用或IL指令取决于 对其应用转换的表达式。一些 转换被优化掉了,比如CInt(123.45),它被替换了 在IL中使用整数常量123。这是一个例子,其中 使用Visual Basic运行时会使性能优于 使用系统名称空间

但是,它最后的建议是:

建议:对于大多数转换,请使用内部语言 转换关键字(包括CType),以简洁明了,并 在类型之间转换时允许编译器优化。使用 DirectCast用于将对象转换为字符串和提取值 当嵌入类型已知时(即 是的,胁迫是没有必要的)


使用
MyDecimal.ToDouble
时出现的错误是因为
ToDouble
是一个共享方法,而不是实例方法。您需要的是
MyDouble=Decimal.ToDouble(MyDecimal)
。我也觉得各种转换方法相当令人困惑。你忘了
DirectCast(MyDecimal,Double)
还有
CDbl(MyDecimal)
@MattWilko&JoelCoehoorn以前从未见过这些方法,drat!然而,声明“CType是内联编译的,这意味着转换代码是计算表达式的代码的一部分。在某些情况下,代码运行得更快,因为没有调用任何过程来执行转换。”ToDouble和隐式强制转换之间有什么区别?他们不是都做同一件事吗?甚至在
Decimal.ToDouble
Convert.ToDouble
CType
之间也不是VB6的“遗留”。你可能把它和另一个C混淆了???方法,如
CDec
Cint
Cstr
等。这对于OP是错误的方法,但您的解释是错误的。所有
C!()
强制转换实际上都是运算符而不是函数。它们只是用函数语义实现的。虽然我真的很讨厌vb.net中提供的vb6时代的函数,如
LEN()
MID()
,但操作符只是语言的一部分。@Blackwood,这本书中有一些好消息。我倾向于选择
Convert.ToXXX
,但是像
CInt
这样的VB在某些情况下更好(更内联,并且处理系统崩溃的情况
System.Convert
)。Matt,根据你的链接,我使用了
Dim d作为Double=CDbl(MyNumericUpDown.Value)
    Dim test As Decimal = 2.22
    Dim myDouble As Double

    myDouble = Convert.ToDouble(test)

    myDouble = Decimal.ToDouble(test)