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

本文关键字:转换 当时 时间 | 更新日期: 2023-09-27 18:37:24

所以我一直认为在 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. 谁能提供一个简单的解释?

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

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

    当您要强制转换的类型
  • 是要从中转换的类型时
  • 为这些类型定义显式强制转换运算符时

在所有其他情况下,您应该使用转换或其他自定义转换方法(例如 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;

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

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

但是,显式转换的规则是不同的

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

如果希望强制转换的操作与Convert.ToInt32相同[或想要指定舍入的工作方式],则应将 Math.Round 方法与强制转换一起使用,如下所示。

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

还有其他方法签名允许您指定如何舍入。

至于何时应使用强制转换和转换,

应尽可能使用显式强制转换,因为当从更精确类型变为不太精确的类型并适当处理它时,您将失去精度,并在数据不应采用可强制转换的格式时进行转换。 如果可能是指存在显式转换(包括隐式转换)。 预定义的转换可以在规范的第 6 节中找到

形式 (T)E 的强制转换表达式,其中 T 是类型,E 是类型 一元表达式,执行显式转换(第 6.2 节) 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;
}