2010-02-25 13 views
7

是否有配置VS2008 C#编译器给这样的代码,一个警告道:C#编译器可以配置为在显式强制转换可能导致数据丢失时发出警告?

Int64 x = 123456789000; 
Int32 y = (Int32)x; 
+8

是不是你必须在编写代码时使用足够的显式转换警告?明确的演员通常会告诉编译器“嘿,我知道我在做什么”。 – Joey 2010-02-25 15:03:04

+0

我们有一些代码正在做一些导致数据丢失的明确转换。我们需要清理它。我希望有一个编译器选项可以帮助我们找到这些情况。 C++对此有警告;我认为c#可能有一些东西。 – HBFan 2010-02-25 15:29:20

回答

0

进入属性查看项目,单击生成选项卡,单击高级按钮在右下角,检查“检查算术溢/下溢”复选框

+2

这将导致溢出检查代码被插入,导致运行时异常,而不是编译时警告。 – Joey 2010-02-25 15:05:10

2

编译器不能做,在编译的时候,但你可以配置它扔在运行时产生的异常,

在项目属性 - >建设 - >高级 - >检查溢出\下溢

10

明确演员的全部意思是说:“我为这个问题负责,请做就做。”

在您的微不足道的情况下,编译器可能很容易发现该值不适合Int32,从而产生您的警告。

但是,你看这个:

Int64 x = CallSomeMethod(); 
Int32 y = (Int32)x; 

怎样才提醒你这件事?如果它:

  1. 试图找出CallSomeMethod的值可以返回什么样的范围?
  2. 总是警告? (那么会有什么意义呢?)

这里最好的希望是有一个运行时检查或类似的东西,编译器不能阻止你所有可能出错的东西。

5

全部必要强制转换可能会导致数据丢失。演员的目的是告诉编译器“我在这里做了一些危险的事,你不能分析,但我知道我在做什么”。由于演员的全部目的是处理编译器不够聪明的情况下进行分析的情况,期望编译器分析它以提供警告似乎毫无意义。

因此,您的建议是有效地警告每个必要的铸件,这似乎适得其反。

我注意到隐式转换也会在一些极少数情况下导致数据丢失。隐式转换可能会丢失精度的位;隐含转换保留的是数量级

1

我同意Lasse V. Karlsen's明确演员阵容的解释。

在这种情况下,你的一个可能的解决方案是真正在你的代码删除的显式转换(查找和替换它们)如果你真正希望有“警告”,当类似这样exists.It铸造会意味着您将不得不手动检查发生的所有演员(在警告列表中)并确定他们是否有效。所以你的代码应该是这样的:

Int64 x = 123456789000; 
Int32 y = x; 
相关问题