亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 C# 6 索引初始值設定項中使用 C# 8 空值寬容運算符

在 C# 6 索引初始值設定項中使用 C# 8 空值寬容運算符

PHP
aluckdog 2024-01-20 16:06:22
當使用索引初始值設定項填充字典而不在此之前重新創建它時,是否有一個選項可以在某處指定 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"    }};
查看完整描述

1 回答

?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

我仍然想知道是否有解決方案來防止此編譯器警告


我認為你的意思是,除了明顯的#pragma方法之外:


#pragma warning disable 8602

    new Program

    {

        NullableDictionary = { ["key"] = "value" }

    };

#pragma warning restore

這顯然有效。或者,當然,上面的“可空引用類型”特定版本:


#nullable disable

    new Program

    {

        NullableDictionary = { ["key"] = "value" }

    };

#nullable restore

這兩者都暫時且明確地禁用相關警告??罩祵捜葸\算符本質上就是這樣做的,當然除了它所應用的特定表達式之外。


無論好壞,我認為沒有一種方法可以完全滿足您的要求。通常,僅在實際變量聲明中才允許使用集合初始值設定項語法。在對象初始化語法上下文中使用它是該語言允許的一種特殊情況,基于場景的相似性,即使生成的代碼與實際的變量初始化非常不同(特別是,您在其中事實上,在初始化集合的同時初始化變量的值)。


因此,當編譯器處理集合初始值設定項語法時,編譯器所要做的就是生成對方法的一堆調用Add(),并且這些調用是對可能為 null 的引用值進行的,根據您之前的聲明。


話雖如此,我發現您嘗試在那里使用 null-forgiving 運算符非常明智。Add()如果編譯器能夠通過在其生成的每個調用中包含該運算符來解釋該上下文中運算符的使用,那就太好了。


您甚至可以針對該語言提交 Git 問題,并要求將其添加為一項功能。我認為這不會是一個重大變化,因為該語法目前完全是非法的,并且當您不使用該語法時允許它不會改變編譯器的行為。


查看完整回答
反對 回復 2024-01-20
  • 1 回答
  • 0 關注
  • 135 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號