我有以下问题
private int GetInt(dynamic a)
{
return 1;
}
private void UsingVar()
{
dynamic a = 5;
var x = GetInt(a);
}
但是x仍然是动态的。我不理解为什么。
由于在GetInt
方法调用中,您的参数a
具有dynamic
类型,因此重载决策发生在运行时而不是在编译时。
根据此文:
如果方法调用中的一个或多个参数具有
dynamic
类型,或者方法调用的接收器是dynamic
类型,则重载决策将在运行时而不是在编译时发生。
实际上,使用dynamic
即使用了后期绑定(推迟到更晚的绑定时间),这意味着编译器无法验证它,因为它不再使用任何静态类型分析。
解决方法是像这样使用强制转换:
var x = (int)GetInt(a);
private void UsingVar()
{
object arg = 5;
if (<>o__2.<>p__0 == null)
{
Type typeFromHandle = typeof(C);
CSharpArgumentInfo[] array = new CSharpArgumentInfo[2];
array[0] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null);
array[1] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null);
<>o__2.<>p__0 = CallSite<Func<CallSite, C, object, object>>
.Create(Microsoft.CSharp.RuntimeBinder.Binder
.InvokeMember(CSharpBinderFlags.InvokeSimpleName, "GetInt", null, typeFromHandle, array));
}
object obj = <>o__2.<>p__0.Target(<>o__2.<>p__0, this, arg);
}
.GetType()
在运行时被解析。 - Salah Akbari