所以,如果我想传递一个可以为空的值类型,如Int32?在方法中,我必须告诉方法参数它是可以为空的。
public void foo(Int32? arg){...}
如果我将常规Int32传递给arg就可以了。但如果我把它改成
public void foo(Int32 arg){...}
并传入一个可以冒犯它的怪物。
所以我的问题是吗?改变Int32的类型?
有Int32吗?对象还是做的?只需在Int32中设置一个标志并使其可以为空?
基本上我是在问我们幕后发生了什么。
答案 0 :(得分:2)
Int32?
是Nullable<Int32>
的缩写形式,因此这是两种不同的类型。 Int32
可以隐式转换为Nullable<Int32>
,但不是另一种方式。
在http://msdn.microsoft.com/de-de/library/b3h38hb0(v=vs.100).aspx中,您可以看到两个运算符:
Explicit(Nullable<T> to T): Returns the value of a specified Nullable<T> value.
Implicit(T to Nullable<T>): Creates a new Nullable<T> object initialized to a specified value.
答案 1 :(得分:2)
Nullable结构实现了int类型到int?的隐式转换,而另一种方式是显式的,因此在第一种情况下,转换是隐式的,第二种是必须进行显式转换。这是Nulable struct的代码的构造:
public static implicit operator T?(T value)
{
return new T?(value);
}
public static explicit operator T(T? value)
{
return value.Value;
}
答案 2 :(得分:0)
Int32?
与Nullable<Int32>
同义,或仅与Nullable<int>
或int?
int?
是一个值类型,它可以具有值null
,这就是为什么你不能将它传递给类型为int
的函数参数的原因 - 如果它会发生什么?它的值是null
?