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

在C#6索引初始值设定项中使用C#8空原谅运算符,c#,c#-8.0,collection-initializer,nullable-reference-types,C#,C# 8.0,Collection Initializer,Nullable Reference Types,当使用索引初始值设定项填充字典而不在此之前重新创建字典时,是否有选项在某个地方指定空原谅运算符 示例: public class Program { public IDictionary<string, string>? NullableDictionary { get; set; } = new Dictionary<string, string>(); public static void Main(string[] args)

当使用索引初始值设定项填充字典而不在此之前重新创建字典时,是否有选项在某个地方指定空原谅运算符

示例:

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"
            }
        };
    }
}
我仍然想知道是否有一个解决方案来防止这个编译器警告

我想你的意思是,除了明显的
#pragma
方法之外:

#杂注警告禁用8602
新节目
{
NullableDictionary={[“键”]=“值”}
};
#pragma警告恢复
这显然有效。当然,也可以是“可空引用类型”——上述类型的特定版本:

#可空禁用
新节目
{
NullableDictionary={[“键”]=“值”}
};
#可空还原
这两种方法都会暂时明确地禁用相关警告。空原谅运算符基本上就是这样做的,当然,除了它应用于的特定表达式之外

不管是好是坏,我认为没有一种方法可以完全满足你的要求。通常,集合初始值设定项语法只允许在实际变量声明中使用。基于场景的相似性,在对象初始值设定项语法上下文中使用它是语言允许的一种特殊情况,即使生成的代码与实际变量初始化非常不同(尤其是在初始化集合的同时初始化变量的值)

因此,当编译器处理集合初始值设定项语法时,编译器所要做的就是生成一系列对
Add()
方法的调用,并且根据您之前的声明,这些调用是对可能为null的引用值进行的

综上所述,我发现您尝试在那里使用null原谅运算符是非常明智的。如果编译器能够通过在它生成的每个
Add()
调用中包含该运算符来解释该运算符在该上下文中的用法,那就太好了


您甚至可以针对该语言提交一个Git问题,并要求将其作为一项功能添加。我认为,这不会是一个突破性的更改,因为该语法目前显然是非法的,如果您不使用该语法,允许它将不会改变编译器的行为。

而不分析整个应用程序的流程tion编译器如何知道没有其他代码将
NullableDictionary
设置为null?对象初始值设定项是
new
创建的对象的一系列属性赋值的简写。集合和字典初始值设定项是相应类型的
Add
调用的简写。编译器知道t
NullableDictionary
可以为null,因为它被声明为
IDictionary?
@PanagiotisKanavos:“如果不分析整个应用程序的流,编译器如何知道没有其他代码将NullableDictionary设置为null?”--如果编译器允许OP建议的语法,那么它将如何“知道”。也就是说,由于集合初始值设定项转换为一系列
NullableDictionary.Add()
调用,因此当包含
运算符时,它可以将其转换为
NullableDictionary!.Add()
,或者将
NullableDictionary!
复制到一个不可为null的临时变量,等等…..
的全部要点就是我们不希望编译器进行任何流分析,而只是相信我们知道该值在该点不为null。
new Program
{
    NullableDictionary! =
    {
        ["key"] = "value"
    }
};