请看演示程序。
我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。
下面例子中,你无法这样写:
if(res1==null)
{
}
因为结构体的缺少值不是null。
演示程序:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public struct structdata { public string name; public Dictionary<string, int> dicData; } static List<structdata> list1 = new List<structdata>(); static void Main(string[] args) { var dic1 = new Dictionary<string, int>(); dic1.Add("key1", 1); dic1.Add("key2", 2); var dic2 = new Dictionary<string, int>(); dic1.Add("key3", 3); dic1.Add("key4", 4); list1.Add(new structdata() { name = "lxy1", dicData= dic1 }); list1.Add(new structdata() { name = "lxy2", dicData = dic2 }); var res1=list1.Find(s => s.name == "lxy1"); structdata? res2 = list1.Find(s => s.name == "lxy22"); } } }
如果我用?符号呢?像下面这样写
structdata? res2 = list1.Find(s => s.name == "lxy22");
这时候下面这样写就合法了。但是结果不对。此时res2为false,不正确
if(res2==null)
{
}
通过变量监视可以看到,res2整体不是null, 只是因为?符号的原因,可以做为null返回。但是find()还是返回的缺省值。
因此,还是得像下面这样写:
if(res2.Value.name==null && res2.Value.dicData==null)
{
Console.WriteLine("is null");
}

