猿问

元组值返回 null 的字典?

我有一个类,其中的字典定义为私有成员:

    Dictionary<int, (string, string)> arenaIdToSetAndNumber = new Dictionary<int, (string, string)>()
    {
        { 70506, ("c16", "337") },
        { 70507, ("c16", "340") },
        { 70508, ("c16", "343") },
        { 70509, ("c16", "346") },
        { 70510, ("c16", "349") },
    };

在调试时,我找到了与 key 相对应的项目70506,我用 2 个手表看到了这一点:

我尝试这样做var test = arenaIdToSetAndNumber[c.grpId].Item1,并将test其设置为 null与第二块手表中看到的一样!我不明白为什么



萧十郎
浏览 107回答 2
2回答

慕田峪7331174

调试器和观察器无法从索引器运算符 [] 推断 Item1 是什么,因此在观察器中将为您提供 null。但是一旦你运行代码,它就可以很好地用于阅读目的。为了写作目的,您需要取出整个元组,对其进行编辑并重新插入字典中:static void Main(string[] args)     {         Dictionary<int, (string, string)> arenaIdToSetAndNumber = new Dictionary<int, (string, string)>()         {             { 70506, ("c16", "337") },             { 70507, ("c16", "340") },             { 70508, ("c16", "343") },             { 70509, ("c16", "346") },             { 70510, ("c16", "349") },         };        var myTuple = arenaIdToSetAndNumber[70509];         myTuple.Item1 = "c18";         arenaIdToSetAndNumber[70509] = myTuple;                 //System.Console.WriteLine(arenaIdToSetAndNumber[70509].Item1); // This prints c18     }否则,在一行中,只需重新创建整个元组:arenaIdToSetAndNumber[70509] = ("c18", arenaIdToSetAndNumber[70509].Item2);所有这一切都是因为 ValueTuple 是一个结构。

凤凰求蛊

这不使用元组,但解决了您的问题。由于您想要读取值,请创建一个不可变的类,因此请使用属性来检索值。public class Contents{&nbsp; &nbsp; private readonly string leftValue;&nbsp; &nbsp; private readonly string rightValue;&nbsp; &nbsp; public Contents(string aLeftValue, string aRightValue)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; leftValue = aLeftValue;&nbsp; &nbsp; &nbsp; &nbsp; rightValue = aRightValue;&nbsp; &nbsp; }&nbsp; &nbsp; public string LeftValue => leftValue;&nbsp; &nbsp; public string RightValue => rightValue;&nbsp; &nbsp; &nbsp; &nbsp;}修改您的代码以使用新类。&nbsp;Dictionary<int, Contents> arenaIdToSetAndNumber = new Dictionary<int, Contents>()&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { 70506, new Contents("c16", "337") },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { 70507, new Contents("c16", "340") },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { 70508, new Contents("c16", "343") },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { 70509, new Contents("c16", "346") },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { 70510, new Contents("c16", "349") },&nbsp; &nbsp; &nbsp; &nbsp; };你可以用这个来测试它。&nbsp; var content = arenaIdToSetAndNumber[70506];&nbsp; string leftValue = content.LeftValue;&nbsp; string rightValue = content.RightValue;希望这能解决您的问题。
随时随地看视频慕课网APP
我要回答