C# 智能感知对于采用动态参数的方法不正确

标签 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 的类型错误(动态)

在我对已经原型(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/

相关文章:

c# - Xamarin - 在 C# 中设置 Azure 离线同步

c++ - CMake 和 Visual Studio 资源文件

c# - 我可以使用 C# 获取 Windows 的原始安装日期吗?

c# - 哈希表是可序列化的吗?

c# - Azure 函数使用不正确的 DLL 版本

visual-studio - 如何在VS 2008生成后事件中使用系统环境变量?

c++ - 在我的 cpp 或头文件中找不到错误,类构造失败

javascript - 如何使用 jQuery 动态添加外部脚本?

javascript - 如何使用 JavaScript 动态定义 QML 状态

java - 使用 java (android) 在 php 中动态更改 mysql 查询