C# 内联检查语句不起作用

标签 c# casting exception-handling

我有两种测试方法。第一个工作正常。第二个不会抛出异常,但它应该抛出异常。为什么第二个不抛出异常?

[TestMethod]
[ExpectedException(typeof(OverflowException))]
public void LongToInt_OverflowWithCheckedBlock()
{
    checked
    {
        int maxValue = 2147483647;
        long longValue = (maxValue + 1);
        int intValue = (int)longValue;
    }
}

[TestMethod]
[ExpectedException(typeof(OverflowException))]
public void LongToInt_OverflowWithCheckedStatement()
{

    int maxValue = 2147483647;
    long longValue = (maxValue + 1);
    int intValue = checked((int)longValue);     // No Exception is thrown, why?
}

最佳答案

第一个抛出而第二个没有抛出的原因是因为您的比较有点偏差。

  • 在第一种方法中,你检查一切
  • 在第二种方法中,您只检查longint 的转换。

如果你像下面这样比较它们,它们是相等的并且都不会抛出:

private static void MethodA()
{
    int maxValue = 2147483647;
    long longValue = ( maxValue + 1 );
    checked
    {
        int intValue = ( int ) longValue;
    }
}

private static void MethodB()
{
    int maxValue = 2147483647;
    long longValue = ( maxValue + 1 );
    int intValue = checked( ( int ) longValue);
}

这是因为这一行:int intValue = checked(( int ) longValue); 不是抛出的那一行,而是这一行:

long longValue = ( maxValue + 1 );

如果我把选中的放在那里,它们都会抛出:

long longValue = checked( maxValue + 1 );

为什么会抛在这里:

它抛出是因为 ( maxValue + 1 ) 将 1 加到一个名为 maxValueint (此处发生异常)并且 之后 将它分配给一个 long,如果你在执行添加 1 它不会抛出:

long longValue = ( (long) maxValue + 1 );

关于C# 内联检查语句不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45812002/

相关文章:

c# - 将字符串数组添加到 JObject

generics - F#:转换为泛型

c# - 带有 ExceptionFilterAttribute 的 UnitTest ApiController

php - 在 PHP 中重新抛出异常是否会破坏堆栈跟踪?

c++ - C++ 是否有办法忽略函数的异常?

c# - C# 中的 eBay API GetSellerList 调用返回错误 14005 'Web Service framework internal error. execute exception.'

c# - 我如何编写介于两个值之间的 if 语句?

C# 在 Enumerable.All 扩展中使用带有返回 bool 的异步 lambda 表达式

c++ - 使用函数指针将 C 转换为 CPP

c++ - 符号转换发生在哪里?