对于采用动态参数的方法,C#intellisense不正确

时间:2016-09-17 20:34:42

标签: c# visual-studio dynamic intellisense

考虑遵循简单的课程

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);

1 个答案:

答案 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类型,此时编译器将在编译时完全解析表达式。