gpt4 book ai didi

c# - 为什么使用 Json.NET 时会出现 RuntimeBinderException?

转载 作者:行者123 更新时间:2023-11-30 12:41:37 26 4
gpt4 key购买 nike

以下 C# 在第 2 行导致 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

dynamic element = JsonConvert.DeserializeObject<dynamic>("{ Key: \"key1\" }");
bool match = "key1".Equals(element.Key, StringComparison.InvariantCulture);

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Member 'object.Equals(object, object)' cannot be accessed with an instance reference; qualify it with a type name instead

项目引用 Json.NET 8.0.3

<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net452" />

我可以通过将 element.Key 显式转换为 System.String 来规避异常。

bool match = "key1".Equals((string)element.Key, StringComparison.InvariantCulture);

当检查 element.Key.GetType() 时,返回一个 Newtonsoft.Json.Linq.JValue

为什么 DLR 似乎不知道调用哪个方法并最终调用静态方法 object.Equals(object, object)

编辑:

正如 Amit Kumar Ghosh 所指出的,这可能与 dynamic 类型无关,因为转换为 System.Object 也会导致异常。

bool match = "key1".Equals((object)element.Key, StringComparison.InvariantCulture);

最佳答案

Why is it that DLR does not seem to know which method to invoke and ends up calling the static method object.Equals(object, object)?

因为 element.Key 不是 string,而是 JToken 类型,在调试器中检查它时看起来很糟糕很像一个字符串。

这会导致运行时的重载解析选择最佳匹配:static object.Equals(objA, objB) ,因为它不能调用string.Equals(value, comparisonType) ,因为第一个参数不是字符串。

您可以使用任何动态对象的非字符串属性重现此内容:

dynamic foo = new { Foo = false };
bool equals = "Bar".Equals(foo.Foo, StringComparison.InvariantCulture);

抛出相同的异常。

关于c# - 为什么使用 Json.NET 时会出现 RuntimeBinderException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37029134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com