gpt4 book ai didi

c# - 为什么 dynamic.ToString() 返回介于字符串和字符串之间的东西?

转载 作者:太空狗 更新时间:2023-10-29 22:57:12 25 4
gpt4 key购买 nike

我使用派生自 DynamicObject 的类型作为某些字符串的构建器。最后,我调用 ToString 以获得最终结果。

此时我以为它会给我一个正常的字符串,但这个字符串有点奇怪。当我在其上使用字符串函数时,它的行为就像一个,但它的行为就像我不知道实际上是什么,既不是字符串也不是动态的。


这就是我在构建器上实现 ToString 的方式

public class Example : DynamicObject
{
public override bool TryConvert(ConvertBinder binder, out object result)
{
if (binder.ReturnType == typeof(string))
{
result = ToString();
return true;
}
result = null;
return false;
}

public override string ToString()
{
return base.ToString();
}
}

当我这样运行时

dynamic example = new Example();
Console.WriteLine(example.ToString().ToUpper());

结果正确:USERQUERY+EXAMPLE(在LINQPad中执行时)

但是如果我这样调用第二行

Console.WriteLine(example.ToString().Extension());

在哪里

static class Extensions
{
public static string Extension(this string str)
{
return str.ToUpper();
}
}

应用程序崩溃并出现 RuntimeBinderException 语句

'string' does not contain a definition for 'Extension'

但如果我投出结果它会再次起作用

Console.WriteLine(((string)example.ToString()).Extension());

也许还有一个例子。

Console.WriteLine((string)example); // UserQuery+Example

但是

Console.WriteLine(example); // DynamicObject UserQuery+Example 

在将其转换为字符串之前,您实际上永远无法确定会得到什么。


为什么会发生这种情况,有没有办法避免额外的转换并以某种方式获得真实字符串?

最佳答案

那是因为 dynamic 上调用的 ToString 被键入以返回 dynamic 而不是 string:

dynamic example = new Example();
// test will be typed as dynamic
var test = example.ToString();

当您在 test 上调用 ToUpper 时,它将使用动态绑定(bind)并在运行时解析为 string.ToUpper。您必须转换为具体类型才能逃避动态类型。

扩展方法是一种编译时特性,因此 dynamic 类型作为扩展方法 不支持扩展方法。您仍然可以使用常规静态方法调用语法调用它。

Extensions.Extension(example.ToString());

但同样 - example.ToString() 将返回 dynamic 并且类型绑定(bind)将在运行时发生以检查它是否可以用作 Extensions 的参数.Extension 调用。检查this answer了解详情。

关于c# - 为什么 dynamic.ToString() 返回介于字符串和字符串之间的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41415458/

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