Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态检测foreach语句中的类型不匹配_C#_Visual Studio_Foreach_Resharper - Fatal编程技术网

C# 静态检测foreach语句中的类型不匹配

C# 静态检测foreach语句中的类型不匹配,c#,visual-studio,foreach,resharper,C#,Visual Studio,Foreach,Resharper,我有一个庞大的C#代码库,我正试图在其中重构和清理其他人的混乱代码。我最近偶然发现了这样一块: List<Bar> bars = ... ; ... foreach (Foo foo in bars) { ... } ... public class Bar { ... public static explicit operator Foo() { ... } } 列表栏=; ... foreach(酒吧里的Foo-Foo){…} ... 公共类酒吧 {

我有一个庞大的C#代码库,我正试图在其中重构和清理其他人的混乱代码。我最近偶然发现了这样一块:

List<Bar> bars = ... ;

...

foreach (Foo foo in bars) { ... }

...

public class Bar
{
    ...

    public static explicit operator Foo() { ... }
}
列表栏=;
...
foreach(酒吧里的Foo-Foo){…}
...
公共类酒吧
{
...
公共静态显式运算符Foo(){…}
}
这种类型不匹配是一个问题。而且,正如您可能预期的那样,代码实际上不起作用:这是一个隐藏在显而易见的地方很长时间的bug

然而,该守则是合法的。Visual Studio 2013和ReSharper 2016都没有抱怨这个相当明显的错误:我不得不等到运行时出现异常时才发现代码被破坏。我宁愿早点发现

我已经浏览了Visual Studio和ReSharper选项,试图找到一种方法让我的工具检测这些类型的不匹配:ReSharper的“代码模式”是我能找到的最接近的,虽然它可以识别出错误的语法模式,但它不支持足够深入的类型分析来检测错误

那么,有人知道一种让ReSharper静态检测
foreach
类型不匹配的方法吗?或者,有没有人知道有一种工具可以


更新:我最初忽略了从
栏到
Foo
显式
自定义强制转换操作符-请注意,这是
显式
,而不是
隐式
。cast操作符的存在似乎严重破坏了工具检测此问题的能力。我已经更新了相关代码以显示行为。

好吧,见鬼,这是一个可靠的答案,由Eric Lippert的博客提供

显然,
foreach
插入对
explicit
cast操作符的调用(如果有)

ReSharper允许这样做是正确的,就像VisualStudio一样。某种程度上。(就我个人而言,我仍然认为ReSharper应该就此发出警告,即使这是合法的。)

Lippert先生的几句好话解释了这一点:

答案是:foreach循环语义是在将泛型添加到语言之前设计的。。。在一个拥有泛型的世界中,枚举的绝大多数序列现在都是静态类型的,这是一个错误的特性。但是,如果删除它,将是一个巨大的突破性变化,因此我们只能继续使用它

您可能想知道,在使用泛型的现代代码中,为什么C#编译器不会产生警告。当我在C#编译器团队工作时,我实现了这样一个警告,并在微软的C#代码库上进行了尝试。用正确的代码发出的警告数量很大(有人有一系列动物,但通过其他方式知道它们都是长颈鹿)。在正确的代码中经常触发的警告是错误的警告,因此我们选择不添加该功能


(整个博客帖子都可以在这里找到,它既令人失望,也很有启发性。)

好吧,见鬼,埃里克·利珀特的博客提供了一个可靠的答案

显然,
foreach
插入对
explicit
cast操作符的调用(如果有)

ReSharper允许这样做是正确的,就像VisualStudio一样。某种程度上。(就我个人而言,我仍然认为ReSharper应该就此发出警告,即使这是合法的。)

Lippert先生的几句好话解释了这一点:

答案是:foreach循环语义是在将泛型添加到语言之前设计的。。。在一个拥有泛型的世界中,枚举的绝大多数序列现在都是静态类型的,这是一个错误的特性。但是,如果删除它,将是一个巨大的突破性变化,因此我们只能继续使用它

您可能想知道,在使用泛型的现代代码中,为什么C#编译器不会产生警告。当我在C#编译器团队工作时,我实现了这样一个警告,并在微软的C#代码库上进行了尝试。用正确的代码发出的警告数量很大(有人有一系列动物,但通过其他方式知道它们都是长颈鹿)。在正确的代码中经常触发的警告是错误的警告,因此我们选择不添加该功能


(整个博客帖子都可以在这里找到,既有启发性又令人失望。)

您使用的是什么版本的R#?具体来说,是2016年5月发布的Reformer 2016.1.2。啊!我没有看到更新。我正要告诉你我无法重现这个问题,因为Resharper实际上给了我编译时错误,但是如果定义了显式转换,那么我看到的唯一方法就是首先使用例如list.OfType()迭代过滤。Karel,这是关于静态代码分析,与运行时类型转换无关:我有一个数百万行的代码库,其中包含未知数量的这些bug,我需要一个工具来帮助查找所有这些bug。你能用显式转换更新你的代码吗?这样我们就不会错过任何东西。你使用的是什么版本的R#?2016年5月发布的重塑器2016.1.2。啊!我没有看到更新。我正要告诉你我无法重现这个问题,因为Resharper实际上给了我编译时错误,但是如果定义了显式转换,那么我看到的唯一方法就是首先使用例如list.OfType()迭代过滤。Karel,这是关于静态代码分析,与运行时类型转换无关:我有一个数百万行的代码库,其中包含未知数量的这些bug,我需要一个工具来帮助查找所有这些bug。你能用显式转换更新你的代码吗?这样我们就不会错过任何东西。