使用动态输入参数和对象作为返回类型声明的方法实际上返回动态
本文关键字:动态 声明 返回类型 实际上 返回 方法 输入 参数 对象 | 更新日期: 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
的值。