您可以将 int 隐式转换为 double: double x = 5;
您可以将 int 显式转换为 double: double x = (double) 5;
您可以显式地将 double 转换为 int: int x = (int) 5.0;
为什么不能隐式地将 double 转换为 int?: int x = 5.0;
您可以将 int 隐式转换为 double: double x = 5;
您可以将 int 显式转换为 double: double x = (double) 5;
您可以显式地将 double 转换为 int: int x = (int) 5.0;
为什么不能隐式地将 double 转换为 int?: int x = 5.0;
的范围double
大于int
。这就是为什么你需要明确的演员。由于同样的原因,您不能隐式转换 from long
to int
:
long l = 234;
int x = l; // error
仅当您保证不会因转换而丢失数据时,才能使用隐式转换。因此,您可以将 an 强制转换为integer
adouble
或 an数据类型。但是,从 a转换为 an会冒丢失数据的风险。integer
long
double
integer
Console.WriteLine ((int)5.5);
// Output > 5
这就是为什么微软没有为这个特定的转换编写隐式转换。相反,.NET 框架强制您使用显式转换,以确保您通过从一种类型显式转换为另一种类型来做出明智的决定。
隐式关键字用于声明一个隐式的用户定义类型转换运算符。如果保证转换不会导致数据丢失,则使用它来启用用户定义类型和另一种类型之间的隐式转换。
来源> MSDN
C# 遵循 Java 的类型系统,它对类型int
-> long
-> float
->进行排序double
,并指定出现在另一个左侧的任何类型都可以转换为它。我个人认为以这种方式对类型进行排序是一个坏主意,因为这意味着与直接long l = getSomeValue(); float f=l; double d=f;
存储相比,尽管精度损失严重,但类似的代码将干净地编译而不会发出尖叫声;它还有其他一些不幸的后果。l
d
我怀疑 Gosling 像他所做的那样对类型进行排序,以确保将 afloat
和 a传递double
给一个重载(float,float)
并(double,double)
使用后者的方法。不幸的是,他的排名有一个不幸的副作用,即将int
or传递long
给仅重载的方法float
,double
并将导致该方法使用float
重载而不是double
重载。
C# 和 .NET 遵循 Java 的领先优势,优先使用long
-to-float
转换而不是long
-to- double
;将它们从一些随之而来的方法重载恐怖中“拯救”出来的一件事是,几乎所有具有 for 重载的 .NET Framework 方法也具有 for 重载,float
并且在与其他浮点类型之间不存在隐式转换。因此,尝试将 a 传递给具有、和重载但不具有重载的方法将导致编译错误,而不是转换为.double
Decimal
Decimal
long
float
double
Decimal
long
float
顺便说一句,即使选择允许哪些隐式转换的人已经对这个问题进行了更多考虑,也不太可能允许从浮点类型(例如double
)到离散类型(例如int
)的隐式转换。除其他事项外,产生 2.9999999999994 的计算结果的最佳整数表示在某些情况下是 2,而在其他情况下是 3。如果有时需要以一种方式进行转换,有时需要另一种方式,语言要求程序员表明实际意图通常是好的。
想象一下,你有这段代码:
double x = pi/6;
double y = sin(x);
y 将是 0.5。现在假设 x 被转换为整数,如下所示:
int x = pi/6;
double y = sin(x);
在这种情况下,x 将被截断为 0,然后取 sin(0),即 y = 0。
这就是为什么在许多强类型语言中没有实现从 double 到 int 的隐式转换的主要原因。
int 到 double 的转换实际上增加了类型中的信息量,因此总是可以安全地完成。
当您从 DOUBLE 隐式转换为 INT 时,您正在尝试存储编号。将大内存转换为具有小内存的变量(向下转换)
双 d=4.5;
int x=d;//错误或警告
这可能很危险,因为您可能会丢失信息,例如您可能会丢失双精度数的小数部分,同时将其存储在整数中
而将 int 值存储在双变量(向上转换)中时并非如此。
诠释 x=2;
双 d=x; //正确的
因此编译器不允许从 double 隐式转换为 int(或将 double 值存储在 int 中),因为有人可能会在不知不觉中做到这一点并且期望不会丢失数据。但是,如果你明确地强制转换,这意味着你对编译器说,不管有什么危险,不管怎样,我都会管理..希望它有帮助..