我对Nullable类型的以下行为感到困惑:

class TestClass {
    public int? value = 0;
}

TestClass test = new TestClass();

现在,Nullable.GetUnderlyingType(test.value)返回基础Nullable类型,即int
但是,如果我尝试获得像这样的字段类型
FieldInfo field = typeof(TestClass).GetFields(BindingFlags.Instance | BindingFlags.Public)[0];

然后我调用
Nullable.GetUnderlyingType(field.FieldType).ToString()

它返回System.Nullable[System.Int32]类型。因此,这意味着Nullable.GetUnderlyingType()方法具有不同的行为,具体取决于您如何获取成员类型。为什么?如果我仅使用test.value,如何不使用反射就知道它是Nullable

最佳答案

可空类型有点奇怪。但是,至少它们的行为有据可查。

从MSDN上的C#编程指南中,
http://msdn.microsoft.com/en-us/library/ms366789(VS.80).aspx中的“如何:识别可空类型”:



值得指出的是,标题中的区别是不准确的。类型行为不是基于局部变量或属性而不同,而是取决于是通过运行时对象还是通过反射(或使用typeof运算符)访问类型。您的推论是可以理解的,因为通常只能通过运行时对象访问局部变量的类型,但是这样做有缺陷,因为如果您在运行时通过属性访问器访问可为空的对象,则其行为将等同于局部变量。

另外,要明确回答问题的最后一部分:,在不使用反射的情况下告诉test.value可为空的唯一方法是访问它并获取NullReferenceException (当然,只有在test.value时才能发生如所写,在您的示例中,该值不为null,因此无需反射就无法确定

关于c# - 可空属性与可空局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16381559/

10-10 19:55