考虑这个通用身份函数:
T Id<T>(T x) => x;
如果我在lambda映射中使用它,则数组中的元素
string?
值,它按预期工作(即,它保留了值可以为null的信息)。
var xs = new[] { (string?)"foo" };
var ys = xs.Select(x => Id(x)); // inferred type of `ys` is IEnumerable<string?>
string y = ys.Single(); // warning CS8600: Converting [...] possible null value to non-nullable type.
但是,如果我将其用作方法组,则信息将被丢弃。
var xs = new[] { (string?)"foo" };
var ys = xs.Select(Id); // inferred type of `ys` is IEnumerable<string>
string y = ys.Single(); // no warning CS8600
这是怎么回事?这是编译器错误还是已知的可为null的引用类型限制?
作为变通办法,我可以声明
Id
如下所示,以获得第二个示例中的预期警告:
T? Id<T>(T? x) => x;
但对我来说,这似乎过于表达了。
我使用的是C#10.0。
工作示例:
https://dotnetfiddle.net/SEHIb6