Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中正确的施放时间与转换时间#_C#_Casting - Fatal编程技术网

C# c语言中正确的施放时间与转换时间#

C# c语言中正确的施放时间与转换时间#,c#,casting,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.da

所以我一直认为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
。有人能提供一个简单的解释吗?

您可以在两种情况下使用cast:

  • 当您要转换到的类型是从中转换的类型时
  • 当为这些类型定义时
在所有其他情况下,您应该使用Convert或其他自定义转换方法(例如DateTime.Parse)

为什么它们返回不同的结果

因为执行的代码不同<代码>转换为32(双倍值)对铸造结果进行四舍五入:

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

return num;
在转换过程中,该方法使用以下规则作为其返回值

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

然而,这些规则是不同的

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

如果您希望强制转换的操作与转换.ToInt32的操作相同[或希望指定舍入的工作方式],则应使用如下方法进行强制转换

(int)Math.Round(1.6) //outputs 2
还有其他方法签名,允许您指定如何进行舍入

至于何时应该使用强制转换和转换,您应该在可能的情况下使用,意识到从更精确的类型转换为不太精确的类型并进行适当处理时会丢失精度,以及在数据不希望采用可强制转换的格式时使用转换可能时表示存在显式转换(包括隐式转换)时。预定义的转换可以在规范的中找到

一种(T)E形式的强制转换表达式,其中T是一个类型,E是一个 一元表达式,执行 如果不存在从类型的显式转换,则将E值转换为类型T 对于E到T,会发生编译时错误。否则,结果就是 显式转换产生的值


在所有情况下都没有可以使用的快速规则。你只需要知道每一个都做了什么,然后选择一个最适合你的场景。正如你所指出的,转换和转换可以产生不同的结果。原因是转换和转换可以有完全不同的实现方式

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;
}

Convert
在转换时有一点“魔力”。它分析源类型的值,并应用转换来创建目标类型的新实例。强制转换发生在较低的级别,您只能强制转换相关类型(例如,将浮点数转换为整数)。@Kelix您的示例回答了您自己的问题。通常,当您具有继承时,应该使用强制转换。当无法强制转换时,使用“转换”将一个对象转换为另一个对象。