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

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

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

由于只有一个方法签名,为什么传递动态返回一个动态对象?还是实际上只是Visual Studio 2013变得困惑?

参考方案

这是因为几乎所有涉及动态值的操作都会在执行时动态解析。对于在编译时实际上只有一种方法的情况也没有例外。这种语言更简单。 (对于某些调用,编译器确实会在编译时执行足够的解析度,以确保至少有一种方法具有适当数量的参数-这在C#5规范的7.5.4节中进行了指定,但是并没有影响有效收益类型。)

根据C#5规范的第7.6.5节:

如果满足以下至少一项条件,则动态绑定一个Invocation-Expression:

主表达式的编译时类型为dynamic
可选参数列表的至少一个参数具有编译时类型dynamic,并且主表达式没有委托类型。

在这种情况下,编译器将invocation-expression分类为dynamic类型的值。 [...]

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

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

但是任何方法调用都被视为返回类型为dynamic

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

使用Nginx将动态生成的文件作为静态文件提供 - dynamic

Nginx擅长提供静态文件,因此我想知道是否可以将动态生成的文件作为静态文件提供?例如云,我们使用PHP Minify在Nginx后面的PHP-FPM上组合CSS和JS文件,并几乎像任何静态文件一样为它们提供服务,可能带有一些版本控制和缓存。因此,它的考虑和行为更像是静态文件,然后是动态文件。我知道这听起来更像是缓存,但这就是Nginx如何以最佳状态处理静态…

客户端反序列化为数组序列化字典<string,string>数据 - c#

我有一个字典,该字典使用C#中的JavaScriptSerializer进行了序列化。在客户端,我有:"{"dd049eda-e289-4ca2-8841-4908f94d5b65":"2","ab969ac2-320e-42e1-b759-038eb7f57178":"5�…

Java中的“ <<”运算符 - java

最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…

根据激活的Maven配置文件更新战争名称 - java

在pom中,我有两个配置文件。测试1测试2现在,我希望根据激活的配置文件更改战争名称。预期结果激活test1配置文件后,战争名称应为prefix-test1.war。激活test1和test2时,战争名称应为prefix-test1-test2.war。如果没有激活任何配置文件,则战争名称应为prefix.war。我的POM文件....<?xml ve…