Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#编译器如何保证转换成功?_C# - Fatal编程技术网

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

C#编译器如何保证转换成功?,c#,C#,简而言之,我正在学习C#7.0第7版。文本中有一部分我无法理解(第24页和第25页) “当以下两项均为真时,允许隐式转换: 1) 编译器可以保证它们总是成功的 2) 转换过程中不会丢失任何信息。 (一个小警告是,非常大的长值在转换为double时会失去一些精度) 相反,如果满足以下条件之一,则需要显式转换: 1) 编译器不能保证它们总是成功的 2) 转换过程中可能会丢失信息。” 如果编译器可以确定>转换将始终失败,则禁止两种类型的转换“ 你能给我举个例子说明编译器什么时候不能保证转换吗?数据类型

简而言之,我正在学习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
to
int
也有一个显式运算符。@mrvoid是的,你是100%正确的,我只是觉得只有数字有时可能会有点混乱。谢谢你的回答。那么这仅仅是使编译器决定是否保证转换的数据大小?否。正如MrVoid所说,它取决于两种数据类型。例如,任何带有
字符串的内容都是错误的选择。@Coder