是否有任何插件的VS或程序显示类型和值等。。。一个C#代码选择?

是否有任何插件的VS或程序显示类型和值等。。。一个C#代码选择?,c#,C#,我想做的是被告知表达式选择的类型、值(如果在编译时有)和其他信息(我不知道现在需要什么) 例如,如果我有一个表达式 int i = unchecked((short)0xFF); 选择0xFF将给我(int32255),而选择((短)0xFF)将给我(int16255),选择我将给我(int32255) 我想要这样一个功能的原因是能够验证我的假设。很容易假设0xFF是一个字节,但它实际上是一个int。我当然可以一直参考C语言规范,但我认为每次我想检查一些东西时都必须参考它是低效的。我也可以使用

我想做的是被告知表达式选择的类型、值(如果在编译时有)和其他信息(我不知道现在需要什么)

例如,如果我有一个表达式

int i = unchecked((short)0xFF);
选择0xFF将给我(int32255),而选择((短)0xFF)将给我(int16255),选择我将给我(int32255)

我想要这样一个功能的原因是能够验证我的假设。很容易假设0xFF是一个字节,但它实际上是一个int。我当然可以一直参考C语言规范,但我认为每次我想检查一些东西时都必须参考它是低效的。我也可以使用ANTLR之类的东西,但学习曲线很高

我确实打算阅读整个规范,学习ANTLR和有关编译器的知识,但这是为了以后。现在我希望有工具来帮助我快速准确地完成工作

另一个例子是:

int? i = 0x10;
int? j = null;
int x;
x = (i >> 4) ?? -1;//x=1
x = (j >> 4) ?? -1;//x=-1
对于您来说,上面代码的最后两行可能看起来很容易,甚至很自然。(也许你应该避免这样的代码,但那是另一回事)然而,msdn关于的内容缺乏信息来告诉我上述代码((i>>4)??)是合法的(然而它是合法的,而且是合法的)。我必须深入研究规范中的语法才能知道发生了什么:

  • 空合并表达式
  • 条件或表达式
  • 条件与表达式
  • 异或表达式
  • 和表达
  • 平等表达
  • 关系表达式
  • 移位表达式
  • 移位表达式右移位加法表达式 ... (及更多)

只有在阅读了这么多之后,我才能得到一个令人满意的确认,即它是有效的代码,并且做了我认为它能做的事情。对于普通程序员来说,应该有一种更简单的方法来验证这样的代码(不是关于有效性,而是它是否按照我的想法运行,以及满足我的好奇心),而不必深入到规范手册中。它不必是VS插件。任何直观使用的替代方法都同样适用。

好吧,我不知道有任何外接程序可以实现您所描述的功能-但是,您可以使用一个技巧来确定表达式的类型(而不是编译时值):

  • 将表达式指定给
    var
    变量,并将鼠标悬停在关键字
    var
例如,当你写:

var i = unchecked((short)0xFF); 
然后将鼠标悬停在关键字
var
上,您会看到一个工具提示,提示内容如下:

Struct System.Int16

表示16位有符号整数

这肯定有点尴尬——因为您必须潜在地更改代码以使其工作。但在紧要关头,它可以让编译器为您确定表达式的类型

请记住,一旦你开始向图片中投掷石膏,这种方法并不能真正帮助你。例如:

object a = 0xFF;
var z = (string)a;  // compiles but fails at runtime!

在上面的例子中,IDE会尽职尽责地报告
var z
的类型是
System.String
——但这当然是完全错误的。

你的问题对于你要找的东西有点模糊,所以我不知道“改进的”intellisense是否解决了这个问题,但是我想试试。

你还没有说为什么你需要验证你的假设。如果它们是错误的,您将得到一个编译错误。也就是说,编译器就是您要寻找的工具。@siride:我的一些假设涉及的表达式既不会给出运行时错误,也不会给出编译时错误。最简单的一类问题围绕整数值和位移位、铸造、整文字等展开。。。一个错误的假设可能意味着在一个看似无害的表达中缺少符号扩展。@siride在施法时不是真的。他只会在运行时发现。那么你是想检查缓冲区溢出还是下溢?@Lucas B:我不确定你在这里所说的缓冲区溢出或下溢是什么意思。从更一般的意义上讲,我希望能够以一种相对简单的方式判断一个表达式是否意味着我认为它意味着什么。我不太确定如何在这里进一步表达自己,可能是因为这是一个太一般的要求。我确实使用了var方法,它非常方便。我想到目前为止,除了检查规范或编写表达式测试之外,可能没有简单的方法来完成我想做的事情。而@blizpasta将鼠标悬停在关键字var上之所以有效,是因为它是来自short的类型引用。没有必要在任何事情上悬停,只要阅读(简短)并知道这是一个Int16。@Lucas B:你说得对。var i=0xFF;这将是一个更好的例子。