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
。我不明白为什么。
您可以尝试使用任何返回类型,但结果将是相同的。
答案 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
的值。