C#编译器如何保证转换成功?
简而言之,我正在学习C#7.0第7版。文本中有一部分我无法理解(第24页和第25页) “当以下两项均为真时,允许隐式转换: 1) 编译器可以保证它们总是成功的 2) 转换过程中不会丢失任何信息。 (一个小警告是,非常大的长值在转换为double时会失去一些精度) 相反,如果满足以下条件之一,则需要显式转换: 1) 编译器不能保证它们总是成功的 2) 转换过程中可能会丢失信息。” 如果编译器可以确定>转换将始终失败,则禁止两种类型的转换“C#编译器如何保证转换成功?,c#,C#,简而言之,我正在学习C#7.0第7版。文本中有一部分我无法理解(第24页和第25页) “当以下两项均为真时,允许隐式转换: 1) 编译器可以保证它们总是成功的 2) 转换过程中不会丢失任何信息。 (一个小警告是,非常大的长值在转换为double时会失去一些精度) 相反,如果满足以下条件之一,则需要显式转换: 1) 编译器不能保证它们总是成功的 2) 转换过程中可能会丢失信息。” 如果编译器可以确定>转换将始终失败,则禁止两种类型的转换“ 你能给我举个例子说明编译器什么时候不能保证转换吗?数据类型
你能给我举个例子说明编译器什么时候不能保证转换吗?数据类型向上转换存在隐式转换,如
short
到int
,或int
到long
。另一个例子是int
到float
或double
。这样的数据类型总是可以转换为它们的类型对应的数据类型
另一种说法是不正确的:
double
不能(总是)转换为int
。long
并不总是适合int
或short
编译器无法保证转换的一个例子是,如果您在运行时对类型做出假设。一个非常松散的例子可能是这样的
public int Add(object a, object b)
{
return ((int)a) + ((int)b);
}
在这里,您假设在运行时将传递一个int,无论出于何种原因,您已经失去了类型安全性,并且正在处理一个对象。编译器在编译时不知道也不可能知道这一点,因此您需要显式强制转换
这是一个极端的例子,但希望它能为您澄清一点到目前为止,答案集中在值类型上 对于引用类型,有基类、派生类和接口转换
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
double
到int
?了解这一点的最佳方法是创建一个控制台应用程序并四处玩转,例如,将IFoo接口引用转换为一个Foo对象非常有趣。编译器无法确定它是否真的是一个也实现了IFoo的Bar类对象。如果是,则在r不及时性。一般来说,任何转换都是向上转换的,从不太专业的类型转换为更专业的类型。一般来说,这是个坏主意,但有时是不可避免的。浮点示例不太好,它们实际上在运行时会成功,并且您会得到一个数字,这可能会让您感到惊讶。要添加一些上下文,显式转换的示例是w我将是字符串到整数,因为你永远不知道字符串内容是数字、字母数字还是文本值double
toint
也有一个显式运算符。@mrvoid是的,你是100%正确的,我只是觉得只有数字有时可能会有点混乱。谢谢你的回答。那么这仅仅是使编译器决定是否保证转换的数据大小?否。正如MrVoid所说,它取决于两种数据类型。例如,任何带有字符串的内容都是错误的选择。@Coder