gpt4 book ai didi

c# - 将动态对象传递给 C# 方法会更改返回类型

转载 作者:行者123 更新时间:2023-12-03 03:29:51 27 4
gpt4 key购买 nike

我创建了一个class that inherits DynamicObject并希望创建一个静态方法,该方法可以创建具有预定属性(存储在字典中)的新实例。

public class CustomDynamic : DynamicObject
{
protected Dictionary<string, object> InnerDictionary;

public static T Create<T>(Dictionary<string, object> dictionary) where T : CustomDynamic , new()
{
return new T
{
InnerDictionary = dictionary
};
}
}

用法:

dynamic d = new Dictionary<string, object>();

var realPlayer = CustomDynamic.Create<Player>(d as Dictionary<string, object>);
var dynaPlayer = CustomDynamic.Create<Player>(d);

realPlayer // Player type according to VS2013
dynaPlayer // dynamic type according to VS2013

既然只有一个方法签名,为什么传入一个dynamic会返回一个动态对象呢?或者实际上只是 Visual Studio 2013 感到困惑?

最佳答案

这是因为几乎任何涉及动态值的操作都是在执行时动态解析的。对于编译时实际上只有一种方法的情况也不异常(exception);这样语言就更简单了。 (对于某些调用,编译器确实在编译时执行足够的解析,以确保至少有一个方法具有适当数量的参数 - 这是在 C# 5 规范第 7.5 节中指定的。 4,但这并不影响有效的返回类型。)

摘自 C# 5 规范,第 7.6.5 节:

An invocation-expression is dynamically bound if at least one of the following holds:

  • The primary-expression has compile-time type dynamic.
  • At least one argument of the optional argument-list has compile-time type dynamic and the primary-expression does not have a delegate type.

In this case the compiler classifies the invocation-expression as a value of type dynamic. [...]

有一些涉及动态值的操作仍然具有非动态整体类型。例如:

  • d is Foo 始终为 bool
  • d as Foo 始终是 Foo
  • new Foo(d) 始终为 Foo,即使要使用的确切构造函数是在执行时确定的

但是任何方法调用都被视为具有动态返回类型。

关于c# - 将动态对象传递给 C# 方法会更改返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25892404/

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