为什么推导的带有ExpandoObject参数的方法的返回类型总是动态的?

时间:2019-01-03 08:56:26

标签: c# expandoobject

如下面的代码片段所示,为什么推导的list类型在VS2017中是动态的?因此,此代码将产生编译错误。而且我注意到,如果将dynamic关键字更改为var,则一切正常。

如果我想继续使用dynamic关键字,该如何解决?

class Program
{
    static void Main(string[] args)
    {
        dynamic d = new ExpandoObject();
        var list = GetList(d); // ===> vs deduced list as dynamic
        var r = list.Select(x => x.Replace("a", "_"));
        var slist = new List<string>();
        var sr = slist.Select(x => x.Replace("a", "_"));
        Console.WriteLine(r.Count());
    }

    static List<string> GetList(ExpandoObject obj)
    {
        List<string> list = new List<string>() { "abc", "def" };
        return list;
    }
}

1 个答案:

答案 0 :(得分:1)

可以推断涉及声明为dynamic的参数的操作,以自行返回动力学。来自c# reference

  

大多数动态操作的结果本身就是动态的。结果不是动态的操作包括:(1)从动态转换为另一种类型(2)包含动态类型参数的构造函数调用。

如果要转换回非动态类型,只需按照所需方式声明变量。这有效:

List<string> list = GetList(d);

...并且将允许您其余的代码进行编译。