考虑遵循简单的课程
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的类型是错误的(动态的)
我不能再在b上使用intellisense,直到我做了一个虚拟重铸(int)SomeType.Fn(value),它已经是原型返回一个整数。
问题是,为什么参数中的动态使intellisense改变我的函数原型签名?
即使我将动态插入到函数中,该函数也不能返回其原型中声明的内容,这是一个错误吗?
目前解决方法对我来说是以下
var b = SomeType.Fn((object)value);
答案 0 :(得分:2)
有一种简单的方法可以检查这是否是一个Intellisense错误:调用int
无法使用的方法。如果编译器为变量提供类型int
,那么您将收到编译时错误。如果编译器为变量提供类型dynamic
,那么您将收到运行时错误。
dynamic value = 10;
var a = SomeType.Fn(null);
a.DoesNotExist();
var b = SomeType.Fn(value);
b.DoesNotExist();
如果您尝试这样做,您会发现只有a.DoesNotExist()
会导致编译时错误。
换句话说,您看到的Intellisense行为与编译器的行为完全匹配,即涉及dynamic
参数的方法调用具有dynamic
结果。
您的解决方法不是解决方法,而是一个修复方法。当您拥有dynamic
类型时,您要求编译器确保在运行时解析表达式。当您转换为object
时,您将取出dynamic
类型,此时编译器将在编译时完全解析表达式。