如何解决结构在C#中真的可以不为null吗?
| 下面是一些代码,说明我无法将结构类型声明为null并将其初始化为null。 Nullable类型是一个结构,为什么我可以将其设置为null?Nullable<bool> b = null;
if (b.HasValue)
{
Console.WriteLine(\"HasValue == true\");
}
//Does not compile...
Foo f = null;
if (f.HasValue)
{
Console.WriteLine(\"HasValue == true\");
}
Foo
定义为
public struct Foo
{
private bool _hasValue;
private string _value;
public Foo(string value)
{
_hasValue = true;
_value = value;
}
public bool HasValue
{
get { return _hasValue; }
}
public string Value
{
get { return _value; }
}
}
这个问题已经回答(见下文)。为了澄清,我将发布一个示例。 C#代码:
using System;
class Program
{
static void Main(string[] args)
{
Nullable<bool> a;
Nullable<bool> b = null;
}
}
产生以下IL:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 10 (0xa)
.maxstack 1
.locals init ([0] valuetype [mscorlib]System.Nullable`1<bool> a,[1] valuetype [mscorlib]System.Nullable`1<bool> b)
IL_0000: nop
IL_0001: ldloca.s b
IL_0003: initobj valuetype [mscorlib]System.Nullable`1<bool>
IL_0009: ret
} // end of method Program::Main
声明了a和b,但仅初始化了b。
解决方法
C#编译器为您提供了一些帮助,因此您实际上是在这样做:
Nullable<bool> b = new Nullable<bool>();
这是语法糖
bool? b = null;
if (b ?? false)
{
b = true;
}
,C#有一些语法糖,使您似乎可以将可为null的类型设置为null
。您实际要做的是将可空类型的HasValue
属性设置为false
。
,因为您实际上并未将Nullable<T>
变量设置为null
。结构仍然存在。它通过结构中的内部位标志表示“ 7”。
还有一些编译器糖可以使魔术在幕后发生。
,您不能将结构设置为null,但是可以进行隐式类型转换,这是在后台进行的操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。