var 未检测具有动态输入的方法的结果
var is not detecting result of method with dynamic input
我有以下问题
private int GetInt(dynamic a)
{
return 1;
}
private void UsingVar()
{
dynamic a = 5;
var x = GetInt(a);
}
但是 x 仍然是动态的。
我不明白为什么。
由于您在 GetInt
方法调用中的参数 a
具有动态类型,因此重载解析发生在 运行 时间 在编译时。
基于this:
Overload resolution occurs at run time instead of at compile time if one or more of the arguments in a method call have the type dynamic, or if the receiver of the method call is of type dynamic.
实际上通过使用 dynamic
你使用的是 late binding (推迟到后面),这意味着编译器无法验证它,因为它不会使用任何静态类型分析没有了。
解决方案是使用这样的转换:
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);
}
我有以下问题
private int GetInt(dynamic a)
{
return 1;
}
private void UsingVar()
{
dynamic a = 5;
var x = GetInt(a);
}
但是 x 仍然是动态的。 我不明白为什么。
由于您在 GetInt
方法调用中的参数 a
具有动态类型,因此重载解析发生在 运行 时间 在编译时。
基于this:
Overload resolution occurs at run time instead of at compile time if one or more of the arguments in a method call have the type dynamic, or if the receiver of the method call is of type dynamic.
实际上通过使用 dynamic
你使用的是 late binding (推迟到后面),这意味着编译器无法验证它,因为它不会使用任何静态类型分析没有了。
解决方案是使用这样的转换:
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);
}