2016-09-17 47 views
2

考虑遵循简单的类C#智能感知不正确的方法,它有一个动态的参数

public class SomeType 
{ 
    public static int Fn(dynamic arg) { return 1; }    
} 

及后续声明

dynamic value = 10; 
var a = SomeType.Fn(null); 
var b = SomeType.Fn(value); 

的类型是正确的(INT)

类型的b是错误的(动态)

我不能在b上使用智能感知,直到我做一个虚拟重铸(int)SomeType.Fn(值)为已经原型的返回一个整数。

问题是,为什么参数中的动态会使intellisense改变我的函数原型签名?

即使我将一个动态插入到函数中,该函数只能返回其原型中声明的内容,这是一个错误吗?

我当前解决方法如下

var b = SomeType.Fn((object)value); 
+0

它看起来像一个错误。你在使用VS2015吗? –

+0

它不会改变b的类型,它仍然是'int'(使用'b.GetType()'),也许是intellisense上的错误? –

+1

对我来说,看起来不像是一个Intellisense错误。智能感知行为与编译器的行为相匹配,不是吗? – hvd

回答

2

有一个简单的方法来检查这是否是一个智能感知错误:调用不适用于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类型,此时编译器将在编译时再次完全解析表达式。