为什么这段代码不会抛出异常?

use*_*194 6 c# exception

我期望以下几行代码抛出一个异常,因为我正在访问Value一个可赋值为null的可变变量的属性null.但是,当我执行以下操作时,我没有任何异常:

int? x=null;
Console.WriteLine(x.Value==null);
Run Code Online (Sandbox Code Playgroud)

但当我这样做时:

Console.WriteLine(x.Value);
Run Code Online (Sandbox Code Playgroud)

我确实得到了一个例外,正如可以预料的那样.

但是两种访问方式有什么区别x.Value?为什么我在第一种情况下没有例外?毕竟两段代码都试图访问x.Value属性.

注意:我在www.compileonline.com网站上运行上面的代码,顺便说一句.不确定尝试使用Visual Studio编译器会产生不同的结果,但我目前无法访问Visual Studio.

TIA.

Son*_*nül 5

两个代码抛出InvalidOperationException因为

来自Nullable<T>.Value物业

Nullable<T>如果HasValue属性是当前对象的值true.如果HasValue属性为false,则抛出异常.

在这两种情况下,HasValue属性都是错误的.这就是两个代码抛出的原因InvalidOperationException.

编辑:Okey okey ..看起来www.compileonline.com网站使用Mono 2.10.2.0并且第一个代码只给出警告;

main.cs(9,34):警告CS0472:比较值类型 int' with null isfalse'的结果

我查看了Bug修复页面,但我找不到任何关于此问题的信息.不停寻找..

Mono 2.10.2.0中看起来即使HasValue是假的,这段代码也不会抛出异常.它只是发出警告.

Compiler Warning (level 2) CS0472

表达式的结果始终为'value1',因为类型'value2'的值永远不会等于'value3'类型的'null'

所以在我们的情况下,看起来像单2.10.2.0检查出来x就是int?,但x.Valueint,它说,像(而不是抛出异常);

这是int一个,它是一个值类型,它永远不会等于null.

EDIT2:hdv有一点我认为.这似乎与Bug 12608有关,它已在Mono 3.1.10中修复,但我无法确定.

还在继续搜索..

EDIT3:好的..我尝试了这些代码Ideone,并在sample page其中说它使用Mono 2.8 for C#编译器,结果令人惊讶 ..

你的first example;

int? x = null;
Console.WriteLine(x.Value == null);
Run Code Online (Sandbox Code Playgroud)

它不会抛出任何异常,它甚至都没有显示任何警告.它完美地运作并False因此产生.看起来它不检查HasValue属性,它甚至看不到Nullable<T>(int在我们的情况下)的根是值类型与否.

你的second example;

int? x = null;
Console.WriteLine(x.Value);
Run Code Online (Sandbox Code Playgroud)

InvalidOperationException像我们预期的那样抛出.

未处理的异常:System.InvalidOperationException:Nullable对象必须具有值.在System.Nullable`1 [System.Int32] .get_Value()[0x00000] in:0,在Test.Main()[0x00000] in:0

等一等..

first example,我们说;

看起来它不检查HasValue属性..

如何HasValue在这个时候检查房产?我认为这是一个在线编译器错误,但我仍然无法在Mono 3 +版本上检查它.

编辑4:我发送一条消息,从它的联系页面创建这个网站,并探讨这种情况.


Pet*_*ter 5

在线使用网站时,你指出,单声道编译会对代码进行重写/优化:

using System.IO;
using System;

class Program
{
    static void Main()
    {
        int? x=null;
        Console.WriteLine(x.Value==null);  //-> Console.WriteLine(false);    
    }
}
Run Code Online (Sandbox Code Playgroud)

编译源代码....

$ mcs main.cs -out:demo.exe 2>&1

main.cs(9,38):警告CS0472:比较值类型int' with null isfalse 的结果'

编译成功 - 1个警告

执行程序....

$ mono demo.exe

警告CS0472告诉您,这是他们正在使用的在线/单声道编译器中的错误.