在 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
. 谁能提供一个简单的解释?
您可以在两种情况下使用强制转换:
- 当您要强制转换的类型
- 是要从中转换的类型时
- 为这些类型定义显式强制转换运算符时
在所有其他情况下,您应该使用转换或其他自定义转换方法(例如 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;
}