繁体   English   中英

C#编译器如何保证转换成功?

[英]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 intint to long 另一个例子是int to floatdouble 这些数据类型总是可以转换为更大的对应数据类型。

反过来说不是这样: double不能(总是)转换为int long并不总是适合intshort

如果您在运行时对类型进行假设,则编译器无法保证转换的示例。 一个非常宽松的例子可能是这个

public int Add(object a, object b)
{
    return ((int)a) + ((int)b);
}

在这里,您假设您将在运行时传递一个int,无论出于何种原因您丢失了类型安全性并且您正在使用对象。 编译器在编译时没有也无法知道这一点,因此你需要显式转换。

这是一个极端的例子,但希望它能为你清理一下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM