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

C#intellisense对于采用动态参数的方法不正确,c#,visual-studio,dynamic,intellisense,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)Som

考虑跟随简单类

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),以返回一个整数

问题是,为什么参数中的动态使更改我的函数原型签名具有智能意义

即使我在一个函数中插入了一个动态变量,这个函数也只能返回其原型中声明的内容,这是一个bug吗

我目前的解决办法如下

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

有一种简单的方法可以检查这是否是Intellisense bug:调用一个对
int
不可用的方法。如果编译器将变量的类型设置为
int
,则会出现编译时错误。如果编译器给变量类型为
dynamic
,您将得到一个运行时错误

dynamic value = 10;
var a = SomeType.Fn(null);
a.DoesNotExist();
var b = SomeType.Fn(value);
b.DoesNotExist();
如果您尝试这样做,您会发现只有
a.DoesNotExist()
会导致编译时错误

dynamic value = 10;
var a = SomeType.Fn(null);
a.DoesNotExist();
var b = SomeType.Fn(value);
b.DoesNotExist();
换句话说,您看到的Intellisense行为与编译器的行为完全匹配,即涉及
dynamic
参数的方法调用具有
dynamic
结果


你的解决方案不是解决方案,而是修复方案。当您有
动态
类型时,您要求编译器确保在运行时解析表达式。当您强制转换到
对象
时,您将退出
动态
类型,此时编译器将在编译时再次完全解析表达式。

它看起来像一个bug。您使用的是VS2015吗?它不会改变b的类型,它仍然
int
(使用
b.GetType()
),可能是intellisense上的bug?在我看来根本不像intellisense bug。Intellisense行为与编译器的行为匹配,不是吗?