Gui*_*rez 11 c# null boolean non-nullable
为什么integer == null
C#中的有效布尔表达式,如果integer
(类型的变量int
)不可为空?(我不是反对它,事实上我喜欢它,但我不知道它是可能的)
Jon*_*eet 19
虽然int
它本身是不可空的,但是有一个隐式转换int?
,可以为空.
此时,如果结构体声明了==
两侧具有相同类型的运算符,那么它也可以用于可空类型.
所以这不编译:
public struct Foo {}
class Test
{
static void Main()
{
Foo x = new Foo();
if (x == null)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
...但是如果你给Foo
一些操作符,它会编译,并且没有警告:
public struct Foo
{
public static bool operator ==(Foo x, Foo y) { return true; }
public static bool operator !=(Foo x, Foo y) { return false; }
public override bool Equals(object x) { return false; }
public override int GetHashCode() { return 0; }
}
Run Code Online (Sandbox Code Playgroud)
运算符调用不包含在已编译的代码中,因为编译器知道 RHS为空.
因此,上面表单的代码(Foo
可以由任何非可空取代struct
)具有MS C#5编译器的三种结果之一:
int
)==
)==
,包括Guid
和DateTime
)我不清楚为什么编译器会将某些"已知"类型与普通结构区别对待.编辑:正如Eric在评论中所指出的,这是C#编译器中的已知错误,希望在Roslyn中修复.
归档时间: |
|
查看次数: |
631 次 |
最近记录: |