使用动态输入参数声明的方法和作为返回类型的对象实际上返回动态

时间:2015-06-17 17:29:51

标签: c# .net dynamic visual-studio-2013

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      var objectGetter = new ObjectGetter();
      var obj = objectGetter.GetItem(); //Visual Studio shows that obj type is System.Object
    }
  }

  public class ObjectGetter
  {
    public object GetItem()
    {
      dynamic dObj = "123";
      var obj = this.Convert(dObj);//Visual Studio shows that obj type is "dynamic" here. why???
      return obj;
    }

    private object Convert(dynamic dObj)
    {
      return new object();
    }
  }
}

我希望Convert方法调用将返回System.Object,但实际上它会返回dynamic。我不明白为什么。

您可以尝试使用任何返回类型,但结果将是相同的。

1 个答案:

答案 0 :(得分:1)

问题是您正在使用dynamic参数调用方法。这意味着它是动态绑定的,返回类型被认为是动态的。你需要做的就是不这样做:

object dObj = "123";
var obj = Convert(dObj);

然后Convert调用将被静态绑定,obj将具有object类型。

从C#5规范,第7.6.5节:

  

如果至少满足下列条件之一,则调用表达式是动态绑定的(第7.2.2节):

     
      
  • primary-expression具有编译时类型dynamic。
  •   
  • 可选参数列表的至少一个参数具有编译时类型动态,而primary-expression没有委托类型。
  •   
     

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