Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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#_Casting_Compiler Warnings - Fatal编程技术网

C#编译器是否可以配置为在显式强制转换可能导致数据丢失时发出警告?

C#编译器是否可以配置为在显式强制转换可能导致数据丢失时发出警告?,c#,casting,compiler-warnings,C#,Casting,Compiler Warnings,有没有一种方法可以配置VS2008 C#编译器来对以下代码发出警告: Int64 x = 123456789000; Int32 y = (Int32)x; Int64 x = 123456789000; Int32 y = x; 转到项目的“属性”视图,单击“构建”选项卡,单击右下角的“高级”按钮,选中“检查算术溢出/下溢”复选框编译器无法在编译时执行此操作,但您可以将其配置为在运行时抛出例外 在projectproperties->Build->Advanced->checkoverfl

有没有一种方法可以配置VS2008 C#编译器来对以下代码发出警告:

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

转到项目的“属性”视图,单击“构建”选项卡,单击右下角的“高级”按钮,选中“检查算术溢出/下溢”复选框

编译器无法在编译时执行此操作,但您可以将其配置为在运行时抛出例外


在projectproperties->Build->Advanced->checkoverflow\underflow

中,显式强制转换的全部要点是说“我对这个问题负责,请去做。”

在您的小例子中,编译器可能很容易发现该值不适合Int32,从而产生您的警告

然而,这又如何呢:

Int64 x = CallSomeMethod();
Int32 y = (Int32)x;
它怎么能警告你呢?如果它:

  • 尝试找出CallSomeMethod中的值可以返回什么类型的范围
  • 总是警告吗?(那么重点是什么?)
  • 在这里,您最好希望进行运行时检查或类似检查,编译器无法防止您出现任何可能出现错误的情况。

    所有必要的强制转换都可能导致数据丢失。强制转换的目的是告诉编译器“我正在做一些你无法分析的危险事情,但我知道我在做什么”。由于强制转换的全部目的是处理编译器不够聪明而无法分析的情况,因此期望编译器分析它以发出警告似乎毫无意义

    因此,你的建议实际上是对每一个必要的演员都发出警告,这似乎适得其反

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

    我同意显式转换解释

    在这种情况下,一种可能的解决方案是,如果您真的希望在存在类似强制转换时获得“警告”,则实际删除代码中的显式强制转换(查找并替换它们)。这意味着您必须手动检查发生的所有强制转换(在警告列表中)并确定它们是否有效。因此,您的代码如下所示:

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

    在编写代码时,必须使用显式强制转换警告这一事实难道还不够吗?显式转换通常告诉编译器“嘿,我知道我在做什么。”我们有一些代码正在执行一些导致数据丢失的显式转换。我们需要把它清理干净。我希望我们可以设置一个编译器选项来帮助我们找到这些案例。C++对此有警告;我认为c#可能有问题。这将导致插入溢出检查代码,从而导致运行时异常,而不是编译时警告。