我有这个功能
string F(dynamic a)
{
return "Hello World!";
}
Run Code Online (Sandbox Code Playgroud)
后来当我说
dynamic a = 5;
var result = F(a);
Run Code Online (Sandbox Code Playgroud)
结果必须在编译时是字符串类型,但是没有发生,为什么?事实上,编纂通过这个
int result2 = F(a);
Run Code Online (Sandbox Code Playgroud)
而不是这个
int result3 = F(5);
Run Code Online (Sandbox Code Playgroud)
有什么帮助吗?
这里解释如下:
如果方法调用中的一个或多个参数具有动态类型,或者方法调用的接收方是动态类型,则在运行时而不是在编译时发生重载分辨率.
现在,F(a)由于a是动态的,编译器不会在编译时检查重载.但是当你说:
F(2);
Run Code Online (Sandbox Code Playgroud)
2是整数而不是dynamic.这就是为什么重载解析在编译时发生并且你得到错误.如果你将整数文字转换为动态,你将不会在编译时得到任何错误(但你在运行时做):
int x = F((dynamic)2);
Run Code Online (Sandbox Code Playgroud)