gpt4 book ai didi

c# - 方法中动态方法返回值的显式转换不允许调用扩展方法

转载 作者:太空狗 更新时间:2023-10-29 22:28:04 27 4
gpt4 key购买 nike

下面的代码演示了我的问题:

public class DynamicExample
{
public void DoSomething()
{
var x = new ExpandoObject();
dynamic d = x;
d.GetString = (Func<string>)(() => "Some Value");

d.GetString().SomeStringExtension(); // Doesn't work - expected
((string)d.GetString()).SomeStringExtension(); // Works - expected
Build(d).SomeStringExtension(); // Doesn't work - unexpected?
}

private static string Build(dynamic d)
{
return (string)d.GetString();
}
}

public static class StringExtensions
{
public static int SomeStringExtension(this string s)
{
return s.Length;
}
}

问题是,为什么编译器在将类型内联转换为扩展方法调用和将其转换为单独的方法之间存在差异?

最佳答案

Build(d) 仍然是一个动态表达式 - 该方法的编译时类型是 dynamic 即使可以准确地看到这是怎么回事。这意味着扩展方法将不起作用。

基本上,编译器遵循相当简单的规则来确定表达式的类型,几乎任何涉及dynamic 的表达式最终都会被视为动态表达式。异常(exception)情况是:

  • d 是 SomeType(总是被认为是 bool)
  • 强制转换,包括直接转换和使用 as

就我所记得的,虽然我可能记错了......

现在语言可以被设计成这种情况静态将对Build的调用解析为唯一合理的调用——毕竟,d 不可能是 any 类型,这会改变被调用的方法 - 但指定确切的规则将使语言规范(和编译器)相对较小的 yield 要复杂得多。

关于c# - 方法中动态方法返回值的显式转换不允许调用扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7902100/

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