C# C语言中Cast和Convert的区别#
我有一个sql datareader…我必须从中获取一个十进制值 两者的区别是什么C# C语言中Cast和Convert的区别#,c#,decimal,C#,Decimal,我有一个sql datareader…我必须从中获取一个十进制值 两者的区别是什么 (十进制)数据读取器[“百分比”] 及 Convert.Todecimal(数据读取器[“百分比”]) 这两种方法的pron和cos是什么。只有当datareader[“percent”]返回的对象类型为Decimal时,强制转换才会成功。当对象属于可转换为十进制的任何类型时,转换将成功。这包括int、long、short等。或者更一般地说,实现IConvertible并从IConvertible.ToDecim
这两种方法的pron和cos是什么。只有当
datareader[“percent”]
返回的对象类型为Decimal
时,强制转换才会成功。当对象属于可转换为十进制的任何类型时,转换将成功。这包括int
、long
、short
等。或者更一般地说,实现IConvertible
并从IConvertible.ToDecimal()
返回有用值的任何内容都可以传递给Convert.ToDecimal()
例如:
csharp> object a = (int)1;
csharp> a.GetType();
System.Int32
csharp> var dec = (decimal)a;
System.InvalidCastException: Cannot cast from source type to destination type.
at Class3.Host (System.Object& $retval) [0x00000] in <filename unknown>:0
at Mono.CSharp.Evaluator.Evaluate (System.String input, System.Object& result, System.Boolean& result_set) [0x00000] in <filename unknown>:0
at Mono.CSharpShell.Evaluate (System.String input) [0x00000] in <filename unknown>:0
csharp> var dec = Convert.ToDecimal(a);
csharp> dec;
1
csharp> dec.GetType();
System.Decimal
csharp>objecta=(int)1;
csharp>a.GetType();
System.Int32
csharp>var dec=(十进制)a;
System.InvalidCastException:无法从源类型强制转换为目标类型。
在0中的Class3.Host(System.Object&$retval)[0x00000]处
在Mono.CSharp.Evaluator.Evaluate(System.String输入、System.Object和result、System.Boolean和result_set)[0x00000]中:0
在Mono.CSharpShell.Evaluate(System.String输入)[0x00000]处输入:0
csharp>var dec=转换为特定值(a);
csharp>dec;
1.
csharp>dec.GetType();
十进制
编辑
强制转换是指对象是类型(或派生类型)。Convert的意思是,尽管它可能不是那种类型或派生类型,但存在一种转换到目标类型的方法
e、 g
编辑:很好的观点@cdhowie,弗洛伊德的观点。这应该更具描述性我不知道十进制的具体情况,但我知道对于整数,转换为舍入,而转换为截断,即(int)7.6是7,Convert.ToInt32(7.6)是8。不直接适用于您的示例,但请记住。第一个((十进制)数据读取器[“百分比”]
)是一个显式转换(cast)。它的作用是使编译器将目标值(datareader[“percent”]
)取消装箱或强制转换为十进制。除非datareader[“percent”]
是decimal
或装箱的decimal
,否则这将导致InvalidCastException
第二个运行的代码是.NET的一部分,它检查对象datareader[“百分比”]
的类型,并尝试以适当的方式将其转换为decimal
。如果值是任何类型的数字(例如,int
),则此操作将成功。这里有几个不错的答案,但由于您提到了SqlDataReader,因此您使用了GetDecimal()方法,而不是使用reader[“columnName”]索引器语法。我不知道它是否能为您带来任何性能,但它在不使用Convert或casting的情况下为您提供了类型安全性。Convert不会在出现错误时返回类型的默认值:Convert.ToDecimal(new object())代码>-->System.InvalidCastException:无法从源类型强制转换为目标类型。已修复,我在编写第一个版本时考虑的是TryParse。不管怎样,现在应该更清楚了。豪伊,你用的是什么样的控制台?看起来你有一个类似powershell的控制台,允许你输入C#statements@Harvey这是一个很好的答案,尽管对演员阵容的解释有点误导。可以从say byte强制转换为int。更准确的说法是,只要类型属于同一类别,则强制转换有效。@IanC在取消装箱时不起作用。当将值类型装箱到对象中时,必须强制转换为与装箱值完全相同的类型才能解除装箱(long)(object)(int)1
总是会产生运行时错误,即使(long)(int)1
会成功。@NigelTouch只有在表达式值
被键入double
时才起作用——也就是说,它不是一个取消装箱操作。如果键入了值
对象
,则会将双精度
值装箱,您只能将其强制转换为双精度
。装箱的值对象只能解除装箱为其确切的值类型。(试试这个:(decimal)(object)1.0
。你会得到一个InvalidCastException..)那么当值是一个双精度时,(decimal)值是如何工作的呢?@NigelTouch:(decimal)值是一个转换,它可以工作(十进制)(对象)值
解装箱不正确(双精度
首先装箱到对象
)并抛出(双精度)(对象)值
是正确的解装箱,可以正常工作。
string a = "1234";
object b = a;
// success, a is really a string
string c = (string)b;
// fails because b is not actually an int
int d = (int)b;
// success because there is way to convert the numeric string to an int
int e = Convert.ToInt32(b);