在c#中投射与转换的适当时间

时间:2013-10-29 15:48:47

标签: c# casting

所以我一直认为c#中的转换和转换基本上是一样的:从一种数据类型到另一种数据类型的两种不同方式。显然这是不正确的,因为它们通常会输出不同的结果。

Convert.ToInt32(1.6)     //outputs 2
(Int32)1.6               //outputs 1


(DateTime)("10/29/2013")          //won't compile - cannot convert type 'string' to type 'system.date.time'
Convert.ToDateTime("10/29/2013")  //outputs 10/29/2013 12:00:00 AM
  • 我的问题是两者之间的主要区别是什么?为什么它们会返回不同的结果?
  • 使用其中一个的“适当”时间是多少?

我个人发现自己使用Convert.To方法,因为这对我来说似乎更清晰。我知道它也会抛出System.InvalidCastException。任何人都可以提供直截了当的解释吗?

3 个答案:

答案 0 :(得分:5)

您可以在两种情况下使用强制转换:

在所有其他情况下,您应该使用转换或其他自定义转换方法(例如DateTime.Parse)。

  

为什么他们会返回不同的结果?

因为执行了不同的代码。 Convert.ToInt32(double value)轮次投射结果:

int num = (int) value;
double num2 = value - num;
if ((num2 > 0.5) || ((num2 == 0.5) && ((num & 1) != 0)))    
    num++;

return num;

答案 1 :(得分:1)

在转换中,Convert.ToInt32方法使用以下规则作为其返回值

  

值,四舍五入到最接近的32位有符号整数。如果价值是   在两个整数之间,返回偶数;那   是,4.5转换为4,5.5转换为6.

explicit conversion的规则不同

  

将十进制值转换为整数类型时,此值为   向零舍入为最接近的整数值。如果结果   积分值超出目的地类型的范围,a   抛出OverflowException。

如果你希望强制转换与Convert.ToInt32 [或想要指定舍入的工作方式]相同,那么你应该使用Math.Round方法进行强制转换,如下所示。

(int)Math.Round(1.6) //outputs 2

还有其他方法签名,您可以指定如何进行舍入。

当你应该使用强制转换和转换时,你应该尽可能使用explicit cast 意识到当你从更精确到更精确的类型并适当地处理它时你会失去精确度以及当数据不期望采用可以转换的格式时的转换。 尽可能表示存在显式转换(包括隐式转化)。预定义的转化可以在规范的Section 6中找到

  

形式(T)E的强制转换表达式,其中T是类型,E是a   unary-expression,执行显式转换(第6.2节)   E的值为类型T.如果类型不存在显式转换   从E到T,发生编译时错误。否则,结果是   显式转换产生的价值。

答案 2 :(得分:0)

在所有情况下都没有快速规则可供使用。您只需要知道每个人做了什么,并选择最适合您的场景的那个。就像你自己指出的那样,Convert和cast可以产生不同的结果。原因是Convert和cast可以有完全不同的实现。

public static explicit operator MyStructA(MyStructB b)  
{
    MyStructA a = convert.ToMyStructA(b); 
    //I could do this so that convert and cast return the same but I don't have to.

    return a;
}