.NET中List<string?>转List<string>的编译矛盾及解决方案咨询
List<string?>转List无损耗类型转换解决方案
问题背景
已通过检查确认List<string?>实例中不存在null元素,希望将其转换为List<string>,要求:
- 不创建新列表(避免内存开销与性能损耗)
- 消除编译错误与冗余转换警告
最小可复现示例
using System.Diagnostics; List<string?> xs = new() { "a", "b" }; // 已确认列表中无null元素 if (xs.Exists(x => x is null)) { throw new UnreachableException("Something is broken, we expected no nulls"); } // 直接赋值编译错误 List<string> ys = xs; // 转object强转消除编译错误,但出现"Type cast is redundant"警告 List<string> zs = (List<string>)(object)xs;
现有问题
- 直接赋值:编译错误提示
Nullability of reference types in value of type 'System.Collections.Generic.List<string?>' does not match target type 'System.Collections.Generic.List<string>' - 转object强转:虽通过编译,但Rider会标记"Type cast is redundant"警告
解决方案
方案1:使用Unsafe.As(推荐)
通过System.Runtime.CompilerServices.Unsafe类的As方法直接进行类型引用转换,无性能损耗,且编译器不会发出冗余警告。
using System.Diagnostics; using System.Runtime.CompilerServices; List<string?> xs = new() { "a", "b" }; if (xs.Exists(x => x is null)) { throw new UnreachableException("Something is broken, we expected no nulls"); } // 无损耗转换,无警告 List<string> ys = Unsafe.As<List<string?>, List<string>>(ref xs);
说明:Unsafe.As直接操作内存引用,不会创建新对象,性能为O(1)。仅在已确认列表中无null元素时使用,否则后续操作可能引发NullReferenceException。
方案2:临时禁用冗余转换警告
针对Rider的IDE0004警告(冗余转换),使用#pragma指令临时禁用警告,适合不想引入Unsafe类的场景。
using System.Diagnostics; List<string?> xs = new() { "a", "b" }; if (xs.Exists(x => x is null)) { throw new UnreachableException("Something is broken, we expected no nulls"); } // 临时禁用冗余转换警告 #pragma warning disable IDE0004 List<string> zs = (List<string>)(object)xs; #pragma warning restore IDE0004
说明:仅在需要转换的代码块禁用警告,避免影响其他代码的警告检查。
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

