[英]How does the C# compiler guarantee conversion success?
我正在Nutshell第7版中学习C#7.0。 我无法理解的部分文字(第24和25页)
“当以下两种情况都成立时,允许隐式转换:
1)编译器可以保证它们总能成功。
2)转换中不会丢失任何信息。 (一个小小的警告是,当转换为double时,非常大的long值会丢失一些精度)
相反,如果满足以下条件之一,则需要显式转换:
1)编译器无法保证它们始终会成功。
2)转换过程中可能会丢失信息。“
如果编译器可以确定>转换将始终失败,则禁止这两种转换“
你能给我一些编译器无法保证转换的例子吗?
到目前为止,答案都集中在价值类型上。
对于引用类型,有基类,派生类和接口转换。
class A { } // base class
class B : A { } // B is-an A
class C : A { } // C is-an A
B b = new B(); // instance of B
A a = b; // ok, conversion to base class can't fail because B is an A
C c = (C) a; // but conversion to derived could fail, a could be a B
数据类型向上转换存在隐式转换,例如short
to int
或int
to long
。 另一个例子是int
to float
或double
。 这些数据类型总是可以转换为更大的对应数据类型。
反过来说不是这样: double
不能(总是)转换为int
。 long
并不总是适合int
或short
。
如果您在运行时对类型进行假设,则编译器无法保证转换的示例。 一个非常宽松的例子可能是这个
public int Add(object a, object b)
{
return ((int)a) + ((int)b);
}
在这里,您假设您将在运行时传递一个int,无论出于何种原因您丢失了类型安全性并且您正在使用对象。 编译器在编译时没有也无法知道这一点,因此你需要显式转换。
这是一个极端的例子,但希望它能为你清理一下
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.