gpt4 book ai didi

c# - 为什么返回类型的方法会导致动态的隐式类型化?

转载 作者:行者123 更新时间:2023-11-30 16:43:23 25 4
gpt4 key购买 nike

在下面的代码片段中,为什么隐式类型变量被确定为 dynamic 而不是方法的返回类型 FluentClass

public static class DynamicTest
{
public class FluentClass
{
public FluentClass SomeMethod(dynamic arg)
{
return this;
}
}
public static void Main()
{
dynamic data = new { Data = 1 };

var fluentClass = new FluentClass();
// fluentClass variable is typed FluentClass
var methodResult = fluentClass.SomeMethod(data);
// methodResult variable is typed dynamic
}
}

最佳答案

Why does a method that returns a type result in an implicit typing of dynamic?

因为这是编译器在给定信息的情况下所能做的最好的事情。

methodResult动态 的原因是用于初始化它的整个表达式是动态。情况就是这样,因为 data 是动态的。

当您使用dynamic 时,您是在告诉编译器不要在编译时解析类型。相反,它们应该根据正常的编译器规则在运行时解析。

fluentClass 变量可以保存 FluentClass 的某些实现,其中包含与参数 data 的运行时类型相匹配的重载。在这种情况下,可以调用 SomeMethod() 的不同实现,返回不同的类型。

您已经告诉编译器将类型解析推迟到运行时,因此它不能将事物强制返回到强类型上下文,除非您明确告诉它事物是什么类型。在您的示例中,它不能,因此类型仍然是 dynamic

请注意,您可能认为编译器会根据其dynamic 参数类型识别您提供的一个重载。但这不是 dynamic 的工作方式。 dynamic 参数仅影响方法的实现,即其主体中的代码。就调用方法而言,参数本质上是 object。只是参数值在方法体中使用时,具有动态的特点。

另一种理解 dynamic 的方式是它接受任何对象作为输入(如 object),然后允许您使用您认为的该对象的任何成员存在(如果不存在,将在运行时抛出异常)。使用 dynamic 将编译器逻辑推迟到下游,即对于 dynamic 变量的任何使用的输出,但不影响输入,即该变量的赋值。

还要注意,即使方法调用是完全明确的,例如一个 static 方法,其中只有一个方法具有该名称,您仍然会得到一个 dynamic 结果。一旦您开始使用 dynamic,它就会一直伴随着您,直到您提供显式转换以返回已知类型。


相关阅读:

与你的问题非常相似,如果不是真的重复的话:
Why does a method invocation expression have type dynamic even when there is only one possible return type?
Why does this method keep returning dynamic despite the return type in the signature?
Why doesn't this string.Format() return string, but dynamic?

关于动态的更一般性讨论:
What is the 'dynamic' type in C# 4.0 used for?
C# 4: Real-World Example of Dynamic Types

关于c# - 为什么返回类型的方法会导致动态的隐式类型化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45070531/

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