C#转换为十进制

C#转换为十进制,c#,.net,casting,double,decimal,C#,.net,Casting,Double,Decimal,如果有的话,两者之间的区别是什么 decimal d = (decimal) myDouble; decimal d = new decimal(myDouble); decimal d = Convert.ToDecimal(myDouble); 它们都取得了相同的结果。然而,这里有一个更详细的解释: 方法1创建一个新变量,该变量显式地将myDouble转换为decimal。当您强制转换时,您会说,“这个类型为A的对象实际上是一个类型为B-derived-from-A的对象,或者存在一个强

如果有的话,两者之间的区别是什么

decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);

它们都取得了相同的结果。然而,这里有一个更详细的解释:

  • 方法1创建一个新变量,该变量显式地将
    myDouble
    转换为
    decimal
    。当您强制转换时,您会说,“这个类型为A的对象实际上是一个类型为B-derived-from-A的对象,或者存在一个强制转换操作符来强制转换A到B。”

  • 方法2创建一个新变量,该变量将通过构造函数重载将
    myDouble
    转换为适当的类型(
    decimal
    )。当您调用构造函数时,您的意思是“根据传入构造函数的参数创建一个新对象。”

  • 方法3将一种基本数据类型(
    double
    )转换为另一种基本数据类型(
    decimal
    )。 当您使用类似于Convert.ToDecimal()的东西时,您的意思是,“这个对象不是B类型的,但是有一种方法可以使它成为B类型的对象。”

关于
Convert
MSDN声明:

  • 存在将每个基类型转换为其他基类型的转换方法。但是,实际执行的转换操作分为三类:

  • 从类型到自身的转换只返回该类型。实际上没有执行任何转换

  • 无法产生有意义结果的转换将抛出InvalidCastException。实际上没有执行任何转换。从Char到Boolean、Single、Double、Decimal或DateTime的转换以及从这些类型到Char的转换都会引发异常。从DateTime转换为除字符串以外的任何类型,以及从除字符串以外的任何类型转换为DateTime时,会引发异常。 除上述基本类型外,任何基本类型都可以转换为任何其他基本类型或从任何其他基本类型转换而来

实际上,从功能角度来看,没有任何区别。 这些是实现相同结果的不同方法

重要的是,在这种情况下,您可以指定格式IFormatProvider(区域性),从而获得更大的灵活性


如果你不在乎多元文化的环境,那就挑一个你喜欢的吧。

没有区别。如果您查看来源:

十进制:

public static explicit operator decimal(double value)
{
    return new decimal(value);
}    
转换为:

public static decimal ToDecimal(float value)
{
    return (decimal) value;
}

所以最后他们都调用
新的十进制(双精度)

示例2显示了一个构造函数重载。此外,根据您的定义,示例1中的cast示例不是cast,因为decimal当然不是从double派生的(反之亦然)。相反,C#cast运算符有两个功能:(1)保留引用类型的表示类型转换和(2)调用内置或用户定义的显式(或隐式)转换。我想这里忽略了IFormatProvider,因为输入和输出都不是字符串。是的,正确。注释是关于一般可能的使用差异,但是
(十进制)值
新十进制(值)
之间可能存在差异:第一个调用内置的双精度到十进制转换运算符,而第二个调用十进制构造函数的重载。诚然,本机代码可能是相同的,但IL可能不同,C#语义肯定不同。@phoog两者之间没有区别。没有“内置”的双精度到十进制转换运算符,答案中提供的第一个方法是调用的方法。您提供的第一种方法只调用了您在调用树中提供的第二种方法。@JKor我没有提供任何方法;我只是在评论。@phoog是的,你提供了
(十进制)值
新的十进制(值)
@JKor啊,对不起,我误解了。无论如何,如果没有“内置”的双精度到十进制的转换,那么请解释这个IL:
调用valuetype[mscorlib]System.decimal[mscorlib]System.decimal::op_Explicit(float64)
构造函数示例编译为:
调用实例void[mscorlib]System.decimal::.ctor(float64)
这些最终在运行时编译为不同的
内部调用
方法。