考虑遵循简单的类
public class SomeType
{
public static int Fn(dynamic arg) { return 1; }
}
以及下面的语句
dynamic value = 10;
var a = SomeType.Fn(null);
var b = SomeType.Fn(value);
a 的类型正确(int)
b 的类型错误(动态)
在我对已经原型(prototype)的内容进行虚拟重铸 (int)SomeType.Fn(value) 以返回整数之前,我无法再在 b 上使用智能感知。
问题是,为什么参数中的动态使智能感知改变我的函数原型(prototype)签名?
即使我将动态插入到函数中,该函数也只能返回其原型(prototype)中声明的内容,这是一个错误吗?
我当前的解决方法如下
var b = SomeType.Fn((object)value);
最佳答案
有一个简单的方法可以检查这是否是一个 Intellisense 错误:调用一个不适用于 int
的方法。如果编译器将变量指定为 int 类型,您将收到编译时错误。如果编译器将变量指定为动态类型,您将收到运行时错误。
dynamic value = 10;
var a = SomeType.Fn(null);
a.DoesNotExist();
var b = SomeType.Fn(value);
b.DoesNotExist();
如果您尝试这样做,您会发现只有 a.DoesNotExist()
会导致编译时错误。
换句话说,您看到的智能感知行为与编译器的行为完全匹配,即涉及动态
参数的方法调用具有动态
结果。
您的解决方法不是解决方法,而是修复方法。当您拥有动态
类型时,您会要求编译器确保表达式在运行时得到解析。当您转换为object
时,您将取出dynamic
类型,此时编译器将再次在编译时完全解析表达式。
关于C# 智能感知对于采用动态参数的方法不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39551475/