什么时候int?和 Nullable<int> 是一样的,为什么它们的行为方式不同?

When int? and Nullable<int> are the same, why do they behave in a different way?

考虑以下程序。我想知道为什么这段代码的行为方式不同。

编译时返回错误:

void access<T>(T val, bool result){
var getaccess = val is int? & result;
} 

这没有返回任何错误:

void access<T>(T val, bool result){
var getaccess = val is Nullable<int> & result;
}

这仅仅是因为?&被重载了,也可以分别表示条件运算符和"address of"。编译器需要知道你的意思。这修复了它:

var getaccess = (val is int?) & result;

编译器消息并不完全清楚,但为我们提供了线索:

CS0214  Pointers and fixed size buffers may only be used in an unsafe 

(来自 & result

CS1003  Syntax error, ':' expected

(来自 ?

和:

CS1525  Invalid expression term ';'

(这也是来自 ? 因为它期望在下一个分号之前有一个 : {value if false} 表达式)

基本上,如果没有括号,它认为您的意思是:

var getaccess = (val is int) ? (&result)

(如果 val 不是 int 则缺少表达式)