草庐IT

nullable

全部标签

c# - C# 中具有可空类型的 += 运算符

在C#中,如果我写int?x=null;x+=x??1我希望这等同于:int?x=null;x=x+x??1因此在第一个示例中,x将包含1,就像在第二个示例中一样。但它没有,它包含空值。+=运算符在未分配时似乎不适用于可空类型。为什么会这样?编辑:如前所述,这是因为null+1=null和运算符优先级。在我的辩护中,我认为MSDN中的这一行是模棱两可的!:Thepredefinedunaryandbinaryoperatorsandanyuser-definedoperatorsthatexistforvaluetypesmayalsobeusedbynullabletypes.The

c# - .net 中的可空类型是如何实现的?

在我们自己的JonSkeet的C#indepth,他讨论了为值类型模拟“null”的3种方法:魔法值(例如,最早的DateTime被视为“空”)引用类型包装器bool标志提到可空类型使用第三种方法。可空类型到底是如何工作的? 最佳答案 最终,它们只是一个带有bool标志的通用结构-除了特殊的装箱规则。因为结构(默认情况下)初始化为零,所以bool默认为false(无值):publicstructNullablewhereT:struct{privatereadonlyTvalue;privatereadonlyboolhasValu

c# - .net 中的可空类型是如何实现的?

在我们自己的JonSkeet的C#indepth,他讨论了为值类型模拟“null”的3种方法:魔法值(例如,最早的DateTime被视为“空”)引用类型包装器bool标志提到可空类型使用第三种方法。可空类型到底是如何工作的? 最佳答案 最终,它们只是一个带有bool标志的通用结构-除了特殊的装箱规则。因为结构(默认情况下)初始化为零,所以bool默认为false(无值):publicstructNullablewhereT:struct{privatereadonlyTvalue;privatereadonlyboolhasValu

c# - 将泛型限制为可以为空的事物

我想将我正在编码的泛型限制为任何可以为null的东西。这基本上是任何类+System.Nullable(例如int?等)。对于类部分,这很容易:publicclassMyGenericwhereT:class{}但是,这不允许我这样做:varmyGeneric=newMyGeneric();或者这个:varmyGeneric=newMyGeneric>();编译器提示:错误CS0452:“int”类型?必须是引用类型才能将其用作泛型类型或方法“Test.MyGeneric”中的参数“T”所以我尝试添加System.Nullable作为T的可接受类型:publicclassMyGener

c# - 将泛型限制为可以为空的事物

我想将我正在编码的泛型限制为任何可以为null的东西。这基本上是任何类+System.Nullable(例如int?等)。对于类部分,这很容易:publicclassMyGenericwhereT:class{}但是,这不允许我这样做:varmyGeneric=newMyGeneric();或者这个:varmyGeneric=newMyGeneric>();编译器提示:错误CS0452:“int”类型?必须是引用类型才能将其用作泛型类型或方法“Test.MyGeneric”中的参数“T”所以我尝试添加System.Nullable作为T的可接受类型:publicclassMyGener

c# - 为什么不能在 Nullable<T> 简写上调用静态方法?

我以为T?只是Nullable的编译器简写.根据MSDN:ThesyntaxT?isshorthandforNullable,whereTisavaluetype.Thetwoformsareinterchangeable.但是,有一点(微不足道的)区别:VisualStudio不允许我调用简写的静态方法:boolb1=Nullable.Equals(1,2);//noerrorboolb2=int?.Equals(1,2);//syntaxerror"Invalidexpressionterm'int'"为什么?这种限制有什么原因吗? 最佳答案

c# - 为什么不能在 Nullable<T> 简写上调用静态方法?

我以为T?只是Nullable的编译器简写.根据MSDN:ThesyntaxT?isshorthandforNullable,whereTisavaluetype.Thetwoformsareinterchangeable.但是,有一点(微不足道的)区别:VisualStudio不允许我调用简写的静态方法:boolb1=Nullable.Equals(1,2);//noerrorboolb2=int?.Equals(1,2);//syntaxerror"Invalidexpressionterm'int'"为什么?这种限制有什么原因吗? 最佳答案

c# - 如果不为空则添加到集合

我有一个非常大的对象,其中包含许多可空类型的变量。我还有一本字典,我想用这个对象的非空变量来填充它。代码看起来像这样if(myObject.whatever!=null){myDictionary.Add("...",myObject.whatever);}if(myObject.somethingElse!=null){myDictionary.Add("...",myObject.somethingElse);...编辑(抱歉弄乱了代码)当我们重复无数次时,我们会得到一团很长的代码。有没有更短的方法可以写这个烂摊子?我知道条件运算符(又名?),但这仅适用于作业。是否有类似的东西可以

c# - 如果不为空则添加到集合

我有一个非常大的对象,其中包含许多可空类型的变量。我还有一本字典,我想用这个对象的非空变量来填充它。代码看起来像这样if(myObject.whatever!=null){myDictionary.Add("...",myObject.whatever);}if(myObject.somethingElse!=null){myDictionary.Add("...",myObject.somethingElse);...编辑(抱歉弄乱了代码)当我们重复无数次时,我们会得到一团很长的代码。有没有更短的方法可以写这个烂摊子?我知道条件运算符(又名?),但这仅适用于作业。是否有类似的东西可以

c# - 为什么 Nullable<T> 不是有效的自定义属性参数,而 T 是?

如果我有这样的枚举publicenumHungry{Somewhat,Very,CouldEatMySocks}和这样的自定义属性publicclassHungerAttribute:Attribute{publicHungryHungerLevel{get;set;}publicHungry?NullableHungerLevel{get;set;}}我能做到[Hunger(HungerLevel=Hungry.CouldEatMySocks)]publicclassThing1可是我做不到[Hunger(NullableHungerLevel=Hungry.CouldEatMySo