在C#.Net中将十进制转换为字符串时出现问题

在C#.Net中将十进制转换为字符串时出现问题,c#,asp.net,user-controls,types,decimal,C#,Asp.net,User Controls,Types,Decimal,在将十进制转换为字符串时,我尝试了两种方法 方法1: string a = "100.00", b = "50.00"; string Total = (string)(Convert.ToDecimal(a) + Convert.ToDecimal(b)); 它抛出错误,无法将十进制转换为字符串 方法2: string Total = (Convert.ToDecimal(a) + Convert.ToDecimal(b)).ToString(); 它不会抛出错误,

在将十进制转换为字符串时,我尝试了两种方法

方法1:

    string a = "100.00", b = "50.00";
    string Total = (string)(Convert.ToDecimal(a) + Convert.ToDecimal(b));
它抛出错误,无法将十进制转换为字符串

方法2:

    string Total = (Convert.ToDecimal(a) + Convert.ToDecimal(b)).ToString();
它不会抛出错误,而且工作正常


我想知道这两种转换方法之间的区别,以及当我使用方法1时为什么会出错?

第一种方法是尝试获取一个十进制数(两个十进制数相加的结果)并将其转换为字符串。因为并没有从十进制到字符串的(隐式或显式)转换,所以它会因为不匹配而抛出

第二个方法获取一个decimal并对其调用一个ToString()方法-因为ToString是decimal类型上的一个有效方法,这将进行一个普通的实例方法调用,然后您将获得该调用的返回值,即字符串

string a = "100.00", b = "50.00";
decimal result = Convert.ToDecimal(a) + Convert.ToDecimal(b);
//string total1 = (string)result;
string total2 = result.ToString();
string total3 = Convert.ToString(result);
由于您已经在使用Convert调用,您可能会发现更自然的做法是使用Convert.ToString将十进制数恢复为字符串

string a = "100.00", b = "50.00";
decimal result = Convert.ToDecimal(a) + Convert.ToDecimal(b);
//string total1 = (string)result;
string total2 = result.ToString();
string total3 = Convert.ToString(result);
如果将“添加两个小数”分离到一个单独的局部变量中,可能会更清楚,因为这两个变量在这里都是通用的

所以,(注释掉的)total1失败了,因为它正试图进行强制转换,而我们没有可用的转换来进行转换。后两种方法都可以很好地工作,因为它们都是返回字符串的方法调用

string a = "100.00", b = "50.00";
decimal result = Convert.ToDecimal(a) + Convert.ToDecimal(b);
//string total1 = (string)result;
string total2 = result.ToString();
string total3 = Convert.ToString(result);

在第一种方法中,你基本上在做什么

string a = (string)150m;
其中150是十进制数。从十进制到字符串没有显式或隐式转换。编译器将不理解如何进行转换

在您调用的第二个方法中

string a = 150m.ToString();
在本例中,您正在调用
ToString
方法,该方法是
Decimal
类实现的(与所有其他类一起)。

第一个代码尝试将十进制“类型转换”为字符串,而第二个代码则调用Decimal上的ToString方法以获取十进制的字符串表示形式。从decimal到string的类型转换将不起作用,除非decimal类型重载了类型转换运算符,而decimal类型重载了类型转换运算符,因此类型转换引发异常

在本例中,类型转换类似于要求CLR系统将十进制类型转换为字符串,CLR无法执行此操作,因为它找不到执行此操作的方法。
调用ToString是要求decimal类型返回其字符串表示形式,Method1是一个强制转换,因此您试图将decimal变量中包含的数据作为字符串“读取”…当然不能。例如,您可以将一个字节强制转换为int,因为它们都是数字。相反,对于十进制到字符串,您需要一个显式的转换过程。

这是因为在第一个方法中,您将字符串a和b转换为十进制,但当您只是将类型转换为字符串时,您需要在将该十进制值赋给字符串变量之前将其转换为字符串。
在第二种方法中,您实际上是通过使用
ToString()
方法将十进制值转换为字符串,所以它不会给出错误。

下面是表中的链接,其中说明您不能像在第一种方法中那样将十进制值转换为字符串:


第二个方法正在工作,因为您正在使用对象类的ToString()方法

吹毛求疵,但当System.Object定义ToString()时(显然),实际使用的实现是在System.Decimal中创建的重写。如果不这样做,结果将是一个类似“System.Decimal”的字符串,因为对象ToString()打印出类型名。