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

本文关键字:动态 声明 返回类型 实际上 返回 方法 输入 参数 对象 | 更新日期: 2023-09-27 17:56:59

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 .我不明白为什么。

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

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

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

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

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

从 C# 5 规范第 7.6.5 节:

如果至少存在

以下条件之一,则调用表达式将动态绑定 (§7.2.2):

  • 主表达式具有编译时动态类型。
  • 可选参数列表的至少一个参数具有编译时类型动态,而主表达式没有委托类型。

在这种情况下,编译器将调用表达式分类为类型 dynamic 的值。