?C#中的(可空)运算符

Gov*_*iya 8 c# nullable

通过在值类型数据类型上应用可空运算符来改变什么,现在它可以存储null.

Jon*_*eet 20

正如其他人所说,"?" 只是改变它的简写Nullable<T>.这只是另一个带有布尔标志的值类型,用于表示是否确实存在有用的值,或者它是否为该类型的空值.换句话说,Nullable<T>看起来有点像这样:

public struct Nullable<T>
{
    private readonly bool hasValue;
    public bool HasValue { get { return hasValue; } }

    private readonly T value;
    public T value
    {
        get
        {
            if (!hasValue)
            {
                throw new InvalidOperationException();
            }
            return value;
        }
    }

    public Nullable(T value)
    {
        this.value = value;
        this.hasValue = true;
    }

    // Calling new Nullable<int>() or whatever will use the
    // implicit initialization which leaves value as default(T)
    // and hasValue as false.
}
Run Code Online (Sandbox Code Playgroud)

显然,在实际代码中有更多的方法(如GetValueOrDefault())和转换运算符等.C#编译器添加了提升的运算符,它们有效地代理了原始运算符T.

听起来像是破纪录的风险,这仍然是一种价值类型.它涉及拳击...当你写:

int? x = null;
Run Code Online (Sandbox Code Playgroud)

这不是一个空引用 - 它是null值Nullable<int>,即hasValueis的值false.

当一个可以为空的类型装箱时,CLR有一个特征,即该值被装箱为空引用,或者是一个普通的盒装T.所以如果你有这样的代码:

int? x = 5;
int y = 5;

object o1 = x;
object o2 = y;
Run Code Online (Sandbox Code Playgroud)

称为盒装值由o1o2是无法区分的.你不能说这是拳击可空类型的结果.


Ode*_*ded 5

?语法是语法糖的Nullable<T>结构.

实质上,当您编写时int? myNullableInt,编译器会将其更改为Nullable<int> myNullableInt.

MSDN(向下滚动到"Nullable Types Overview"):

语法T?是Nullable的简写,其中T是值类型.这两种形式是可以互换的.

  • 糖的+1,但我不认为这里的"运算符"这个词是正确的. (2认同)