Dictionary<string,dynamic> 在构建的函数中使用时与在函数外使用时的行为不同,为什么?

Dictionary<string,dynamic> behaves differently when used in function where built than when used out of function, why?

在 Windows Server 2019 上使用 VS 2019 中的调试。我正在一个函数中加载 Dictionary 以在整个程序中使用。当我从函数 (LoadStuff) 中的字典 (dictGen) 中提取动态对象 (o) 时,它工作正常。但是,当它从函数中 returns 时,我无法从字典中提取值并将其用作动态对象,就像我在函数中所做的那样。

所以,这是函数的简短版本:

private void LoadStuff(ref Dictionary<string, dynamic> dictGen) 
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic o = serializer.Deserialize<dynamic>("{}");
o["matchField"] = "i";
o["newField"] = "language";
dictGen.Add("sub div", o);
o = null;
o = dictGen["sub div"];
// in Immediate Window, typing o["matchField"] Displays "i" 
}

然后在调用函数中调用LoadStuff:

Dictionary<string, dynamic> dictGen = new Dictionary<string, dynamic>();
void LoadStuff(ref dictGen);

dynamic o = dictGen["sub div"]
// In Immediate window or in use, typing o["matchField"] gives following error:

"error CS0021: Cannot apply indexing with [] to an expression of type 'object'"

我已经尝试将 dictGen["sub div"] 显式转换为动态,使用 foreach 循环,例如:

foreach(dynamic obj in dictGen.Values)  // using obj["matchField"]
foreach(var key in dictGen.Keys) // obj = dictGen[key]
foreach (KeyValuePair<string, dynamic> ooo in dictGen) // dynamic obj = ooo.Value;

但是不管我怎么试都是一样的问题。那么,在函数中使用 Dictionary 与在 returns 时使用它有什么不同?如何获取 obj["matchField"] 的值?

好吧,我曾希望有人能给我一些想法,让我得到一个好的答案,但那没有发生。因此,我创建了一个普通的 ole C# 对象并在字典中使用它而不是动态对象。它在实际程序中运行良好,所以我将使用它,即使我真的很想知道动态对象的行为方式的原因。