当C#编译器打印"存在显式转换"时,它意味着什么?

Wim*_*nen 8 c#

如果我做一个空的测试类:

public class Foo
{
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下语句编译代码:

Foo foo = "test";
Run Code Online (Sandbox Code Playgroud)

然后我按预期得到这个错误:

无法将类型'string'隐式转换为'ConsoleApplication1.Foo'

但是,如果我将Foo类的声明更改为接口,则错误会更改为此(强调我的):

无法将类型'string'隐式转换为'ConsoleApplication1.Foo'. 存在显式转换(您是否错过了演员?)

什么是应该存在的"显式转换"?

更新:问题比我最初的想法更微妙.要重现它,请将此代码放在Visual Studio 2008中的新控制台应用程序中:

namespace ConsoleApplication1
{
    class Foo
    {
    }

    interface IFoo
    {
    }


   class Program
   {
      static void Main(string[] args)
      {
         Foo b = "hello";
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio将在此时自动显示正确的错误(在构建代码之前).现在插入"I"将"Foo"变成"IFoo"并等待几秒钟而不构建.现在,"显式转换存在"版本的错误将自动出现在错误输出窗口和工具提示中,以用于分配错误.

当您明确命中F6进行构建时,错误的错误会再次消失.

Eri*_*ert 10

我无法重现报告的行为.如果它确实重现,那就是一个bug.没有从字符串到任何用户定义的接口的显式转换.

请使用您正在使用的编译器的版本号以及重现问题的小程序更新问题,我将在bug数据库中输入错误.

谢谢!

更新:显然它不会在命令行上重现,但据称在VS2008中重现.

我无法在VS2010的RC版本中重现它,所以如果这实际上是VS2008中的一个错误,它可能已被修复.我现在还没有安装VS2008方便测试.

无论如何,如果你看到那个诊断,那么几率非常好,它只是语义分析器中错误报告启发式的一个错误.显然,没有从字符串到IFoo的显式转换.

存在从任何未密封类型到任何接口类型的显式转换,因为可能存在实现接口的派生类型.但字符串是密封的,因此错误应该只是"无转换".


gin*_*boy 5

我已经复制了这种行为. 转载.http://i44.tinypic.com/fk6ss6.jpg

Microsoft Visual Studio 2008

版本9.0.30729.1 SP

Microsoft .NET Framework

版本3.5 SP1

已安装版:专业版