The*_*eIT 16 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?
}
Run Code Online (Sandbox Code Playgroud)
Epi*_*Kip 25
第一个抛出的原因和第二个抛出的原因是因为你的比较有点偏差.
check一切check从中投射long到int.如果你比较下面他们是相同的,他们都不会抛出:
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);
}
Run Code Online (Sandbox Code Playgroud)
原因是因为这一行:int intValue = checked(( int ) longValue);不是正在抛出的那一行,它的这一行:
long longValue = ( maxValue + 1 );
Run Code Online (Sandbox Code Playgroud)
如果我把检查放在那里,他们都会抛出:
long longValue = checked( maxValue + 1 );
Run Code Online (Sandbox Code Playgroud)
为什么它会抛出:
它抛出,因为( maxValue + 1 )是增加1到int所谓的maxValue(在这里发生的例外),并在此之后将其分配给一个long,如果你cast在int一个long做加1的时候,才不会抛出:
long longValue = ( (long) maxValue + 1 );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1267 次 |
| 最近记录: |