最近,我遇到了一个关于使用dynamicw的有趣问题。当我将dynamic对象作为参数传递时,无法推断该方法的返回类型。
这是最小的可重现示例:
此代码编译成功:
class Program
{
public static void Main()
{
dynamic data = new { SomeProperty = "ABC" };
string response = IsTrue(data);
if (response == "1")
{
Console.WriteLine("How can this compile?");
}
}
private static bool IsTrue(object someData)
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,IsTrue返回 abool但类型response不是推断为bool。结果,上面的代码编译成功。
在运行应用程序时,我得到以下运行时异常:
未处理的异常。Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:运算符“==”不能应用于 System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0 ,T1,TRet](CallSite 站点, T0 arg0, T1 arg1)
这怎么可能?
当您使用 type 参数调用方法时dynamic,调用是动态绑定的 - 因此编译器也将返回类型视为dynamic。
在某些情况下,编译器会注意到一些不可行的事情,但通常当您使用时,dynamic您会失去很多编译时类型安全性。我对您收到的确切异常感到有些惊讶(这不是我看到的异常),但我对它编译并不感到惊讶。
请注意,这不是dynamic泛型之间的交互- 使用非泛型方法编译相同的代码:
private static bool IsTrue(object someData)
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |