在C#中返回动态有什么用?

时间:2013-05-25 00:49:41

标签: c# dynamic language-theory

...与明显返回一个物体相比。当对象分配给动态声明的变量时,魔法会开始,那么返回动态会产生什么影响呢?

那么有什么区别:

static object CreateMagicList()
{
    return new List<string>();
}

static dynamic CreateMagicList()
{
    return new List<string>();
}

它们似乎都完全相同,例如:

dynamic list = CreateMagicList();
list.Add( "lolcat" );

请注意,这不是一个实际问题。我对部分原因感兴趣:)

3 个答案:

答案 0 :(得分:2)

我最好的猜测是,您可以返回dynamic,以便您可以这样做:

private static dynamic Get() {
    return new {X=5};
}
public static void Main() {
    var v = Get();
    Console.WriteLine(v.X);
}

如果您只能将Get声明为object Get(),那么您的调用者将被强制用var替换dynamic:否则,代码将无法编译。

同样适用于没有var的用例:

public static void Main() {
    Console.WriteLine(Get().X);
}

没有dynamic返回类型,您必须进行中间分配,或使用强制转换为dynamic

答案 1 :(得分:1)

我认为理解你的例子中的特定情况可能不会产生很大的不同,但重要的是要考虑在运行时创建的动态get,这样你就不必动态取消任何动态只需采取一种形式的返回例如,如果不是这样做,你需要不要绑定到动态但列表

static dynamic CreateMagicList()
{
    return new List<string>();
}

List<string> list = CreateMagicList();
list.Add( "lolcat" );

这样可以正常工作,因为在运行时你绑定到同一个属性

但是这个

static object CreateMagicList()
{
    return new List<string>();
}

 List<string> list = CreateMagicList();
    list.Add( "lolcat" );

会给你一个错误,因为你必须将其取消装箱

答案 2 :(得分:0)

您可以返回动态,以便将来可以实际返回动态。 MissingMethodInvoke和MissingPropertyInvoke重载。动力学不仅仅是物体。