请看演示程序。
我们知道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");
}

