动态变量不接受没有类型转换的继承属性

nav*_*een 1 c#

我有这个动态变量,我通过它序列化一个json字符串.

dynamic result = serializer.Deserialize<dynamic>(json);
Run Code Online (Sandbox Code Playgroud)

从这里我获取在运行时result["success"]解析Dictionary<string, object>.然后我应用命名空间,System.Linq以便我可以调用.First()变量.
我写

KeyValuePair<string, object> temp = result["success"].First();
Run Code Online (Sandbox Code Playgroud)

然后我得到了错误,

'System.Collections.Generic.Dictionary'不包含'First'的定义

(但它确实,LINQ,对吗?)现在我改变了这样的代码.

KeyValuePair<string, object> temp = 
    ((Dictionary<string, object>)result["success"]).First();
Run Code Online (Sandbox Code Playgroud)

它没有任何故障.所以我认为可能是因为动态解析变量.然后我试着用的原生属性Dictionary<TKey, TValue>像这样

var foo = result["success"].Keys;
Run Code Online (Sandbox Code Playgroud)

这也没有任何故障,它让我困惑,因此这篇文章.

我理解的是,动态解析的变量只接受本机属性,需要对继承的属性进行类型转换.

我的怀疑是

  1. 我的理解是否正确?
  2. 这是预期的行为吗?
  3. 如果是这样,为什么会这样呢?

PS:在C#4.0中编码

Jon*_*eet 5

但它与LINQ一样,对吧?

不,它没有.这里有一个扩展方法IEnumerable<T>First(),但扩展方法不能被称为dynamic"正常"的路值.

但是,您可以将其用作常规静态方法:

KeyValuePair<string, object> temp = Enumerable.First(result["success"]);
Run Code Online (Sandbox Code Playgroud)

对于你来说,这仍然是动态绑定的 - 而当你施放时 result["success"],在施放之后,一切都只是静态输入.