4

...与简单地返回一个对象相比。当你一个对象分配给一个动态声明的变量时,魔法就开始了,那么返回一个动态有什么不同呢?

那么有什么区别:

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

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

它们的工作方式似乎完全相同,例如:

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

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

4

3 回答 3

2

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

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

如果您只能声明Getobject Get(),那么您的调用者将被迫替换vardynamic: 否则,代码将无法编译。

没有的用例也是如此var

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

如果没有dynamic返回类型,您将不得不进行中间分配,或使用强制转换为dynamic.

于 2013-05-25T00:57:21.417 回答
1

我认为这是理解您的示例中的特定情况的一点,它可能不会产生很大的不同,但重要的是要考虑在运行时创建动态,因此您不必拆箱任何动态的东西,只需采用返回类型的形式如果不是这样做,您需要不绑定到动态,而是列出

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" );

会给你一个错误,因为你必须拆箱

于 2013-05-25T01:00:33.520 回答
0

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

于 2013-05-25T00:59:43.580 回答