在 C# 6 索引初始值设定项中使用 C# 8 空值宽容运算符

当使用索引初始值设定项填充字典而不在此之前重新创建它时,是否有一个选项可以在某处指定 null-forgiving 运算符?


例子:


public class Program

{

    public IDictionary<string, string>? NullableDictionary { get; set; }

       = new Dictionary<string, string>();


    public static void Main(string[] args)

    {

        new Program

        {

            NullableDictionary =

            {

                ["key"] = "value"

            }

        };

    }

}

我知道这个用例(无需重新创建new Dictionary<string, string>索引初始化之前{ [...] = ... })可能不是很常见。但我仍然想知道是否有解决方案来防止上述情况出现编译器警告:


[CS8602] 取消引用可能为空的引用。


我可以想象像这样使用 null-forgiving 运算符:


new Program

{

    NullableDictionary! =

    {

        ["key"] = "value"

    }

};


aluckdog
浏览 85回答 1
1回答

牛魔王的故事

我仍然想知道是否有解决方案来防止此编译器警告我认为你的意思是,除了明显的#pragma方法之外:#pragma warning disable 8602&nbsp; &nbsp; new Program&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; NullableDictionary = { ["key"] = "value" }&nbsp; &nbsp; };#pragma warning restore这显然有效。或者,当然,上面的“可空引用类型”特定版本:#nullable disable&nbsp; &nbsp; new Program&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; NullableDictionary = { ["key"] = "value" }&nbsp; &nbsp; };#nullable restore这两者都暂时且明确地禁用相关警告。空值宽容运算符本质上就是这样做的,当然除了它所应用的特定表达式之外。无论好坏,我认为没有一种方法可以完全满足您的要求。通常,仅在实际变量声明中才允许使用集合初始值设定项语法。在对象初始化语法上下文中使用它是该语言允许的一种特殊情况,基于场景的相似性,即使生成的代码与实际的变量初始化非常不同(特别是,您在其中事实上,在初始化集合的同时初始化变量的值)。因此,当编译器处理集合初始值设定项语法时,编译器所要做的就是生成对方法的一堆调用Add(),并且这些调用是对可能为 null 的引用值进行的,根据您之前的声明。话虽如此,我发现您尝试在那里使用 null-forgiving 运算符非常明智。Add()如果编译器能够通过在其生成的每个调用中包含该运算符来解释该上下文中运算符的使用,那就太好了。您甚至可以针对该语言提交 Git 问题,并要求将其添加为一项功能。我认为这不会是一个重大变化,因为该语法目前完全是非法的,并且当您不使用该语法时允许它不会改变编译器的行为。
打开App,查看更多内容
随时随地看视频慕课网APP