我期望以下几行代码抛出一个异常,因为我正在访问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.
两个代码抛出InvalidOperationException因为
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.Value是int,它说,像(而不是抛出异常);
这是
int一个值,它是一个值类型,它永远不会等于null.
EDIT2:hdv有一点我认为.这似乎与Bug 12608有关,它已在Mono 3.1.10中修复,但我无法确定.
还在继续搜索..
EDIT3:好的..我尝试了这些代码Ideone,并在sample page其中说它使用Mono 2.8 for C#编译器,结果令人惊讶 ..
int? x = null;
Console.WriteLine(x.Value == null);
Run Code Online (Sandbox Code Playgroud)
它不会抛出任何异常,它甚至都没有显示任何警告.它完美地运作并False因此产生.看起来它不检查HasValue属性,它甚至看不到Nullable<T>(int在我们的情况下)的根是值类型与否.
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:我发送一条消息,从它的联系页面创建这个网站,并探讨这种情况.
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告诉您,这是他们正在使用的在线/单声道编译器中的错误.