C# C语言中Cast和Convert的区别#

C# C语言中Cast和Convert的区别#,c#,decimal,C#,Decimal,我有一个sql datareader…我必须从中获取一个十进制值 两者的区别是什么 (十进制)数据读取器[“百分比”] 及 Convert.Todecimal(数据读取器[“百分比”]) 这两种方法的pron和cos是什么。只有当datareader[“percent”]返回的对象类型为Decimal时,强制转换才会成功。当对象属于可转换为十进制的任何类型时,转换将成功。这包括int、long、short等。或者更一般地说,实现IConvertible并从IConvertible.ToDecim

我有一个sql datareader…我必须从中获取一个十进制值

两者的区别是什么

  • (十进制)数据读取器[“百分比”]
  • Convert.Todecimal(数据读取器[“百分比”])

  • 这两种方法的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);