可空属性与可空局部变量我对可空类型的以下行为感到困惑:classTestClass{publicint?值=0;}TestClass测试=newTestClass();现在,Nullable.GetUnderlyingType(test.value)返回基础Nullable类型,即int。但是,如果我尝试获取像这样的字段类型FieldInfofield=typeof(TestClass).GetFields(BindingFlags.Instance|BindingFlags.Public)[0];我调用Nullable.GetUnderlyingType(field.FieldType).ToString()它返回System.可空[System.Int32]类型。这意味着方法Nullable.GetUnderlyingType()具有不同的行为,具体取决于您获取成员类型的方式。为什么?如果我只使用test.value如何在不使用反射的情况下判断它是否为Nullable?可空类型有点奇怪。但是,至少他们的行为有据可查。来自MSDN上的C#编程指南,“如何:识别可空类型”,网址为http://msdn.microsoft.com/en-us/library/ms366789(VS.80).aspx:您还可以使用System.Reflection命名空间用于生成表示Nullable类型的Type对象的类和方法。但是,如果您尝试在运行时使用GetType方法或is运算符从Nullable变量获取类型信息,则结果是表示基础类型的Type对象,而不是Nullable类型本身。?在Nullable类型上调用GetType会导致在类型隐式转换为Object时执行装箱。因此,GetType始终返回表示基础类型的Type对象,而不是Nullable类型。值得指出的是,标题中的区别是不准确的。类型行为不是基于局部变量或属性,而是基于是通过运行时对象还是通过反射(或使用typeof运算符)访问类型。您的推理是可以理解的,因为局部变量的类型通常只能通过运行时对象访问,但是,它是有缺陷的,因为如果您在运行时通过属性访问器访问可为空的对象,它的行为将等同于局部变量。另外,要明确回答问题的最后一部分:在不使用反射的情况下告诉test.value可以为null的唯一方法是访问它并获取NullReferenceException(当然只有当test.value为null时才会发生)如上所述,在您的示例中,该值不为空,因此不需要反射来确定该值。smartcaveman的答案是迄今为止最好的答案,因为它实际上标识了描述此行为的文档部分。这种行为是不可取的,也是不幸的;它的行为是由于三个特征的组合,这些特征本身表现得相当合理。这三个功能是:每个功能本身都是合理的,但组合起来并不理想:当您在有效的可为空的int上调用GetType时,运行时会将可为空的int对象。GetType转换为装箱的int,然后将其作为object.GetType传递给它当然报告int。如果值为nullnullableint,运行时框为null,则对null引用调用GetType并崩溃。这两种行为都不可取,但我们坚持使用它们。问题是您假设Typeoftest.value与Typeoffield.FieldType值相同,但事实并非如此。获取test.value的Type其实就是获取了字段中存储的Type,本例中为0。Typet=test.value.GetType()(在您的示例中)与Typet=0.GetType()相同为了演示,将value初始化为null并且test.value.GetType()将抛出NullReferenceExceptionGetNulllableUnderlyingType返回基础类型对于可为null的类型,对于另一种类型为null;类程序{staticvoidMain(string[]args){Console.WriteLine(GetNulllableUnderlyingType(newTestClass().value));Console.WriteLine(GetNulllableUnderlyingType(newTestClass()));控制台.ReadKey();}公共类TestClass{公共int?价值;}publicstaticTypeGetNulllableUnderlyingType(Tvalue){Typeresult=Nullable.GetUnderlyingType(typeof(T));返回结果;首先,您的示例中的Nullable.GetUnderlyingType(test.value)将无法编译。或我在评论中看到的typeof(test.value)。让我们用以下修改后的代码来回答这个问题:TestClasstest=newTestClass();输入type1=test.value.GetType();//获取字段内数据的类型==>System.Int32.TypeunderlyingType1=Nullable.GetUnderlyingType(type1);//获取System.Int32的底层类型==>null。FieldInfo字段=typeof(TestClass).GetFields(BindingFlags.Instance|BindingFlags.Public)[0];类型type2=字段.FieldType;//现在检索的是字段的类型,而不是里面的数据。==>系统.Int32?输入underlyingType2=Nullable.GetUnderlyingType(type2);//获取System.Int32的底层类型?==>系统.Int32。当你在一个字段上执行GetType()时,你得到的是内部数据的类型,而不是字段本身的类型。例如:对象o=1;输入类型=o.GetType();在此示例中,当您调用GetType()时,您还会获得System.Int32,而不是System.Object。因为在您调用GetUnderylingType之前,当您开始使用不同的类型时,您最终会得到不同的结果。以上就是C#学习教程分享的全部内容:Nullable属性和Nullable局部变量。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
