为什么VB编译器在C#没有捕获到接口类型的无效隐式转换?

tQu*_*lla 1 c# vb.net compiler-errors

比较这个C#(小提琴)

public class Program
{   
    public static void Main()
    {
        IFoo test;
        test = new Impl();
        test = new NoImpl();                
    }
}
public interface IFoo {}
public class NoImpl {}
public class Impl : IFoo {}
Run Code Online (Sandbox Code Playgroud)

到这个VB(小提琴).

Public Module Module1
    Public Sub Main()
        Dim test as IFoo
        test = new Impl()
        test = new NoImpl()
    End Sub
End Module

Public Interface IFoo
End Interface

Public Class NoImpl
End Class

Public Class Impl 
    Implements IFoo
End Class
Run Code Online (Sandbox Code Playgroud)

在C#中,编译器将NoImpl的隐式转换调用为错误.在VB中,代码编译但在运行时失败.

这两种语言/编译器之间有什么具体区别?

可能与我将类转换为接口时没有编译器错误的原因有关吗?

Ron*_*yer 6

从这个页面关于Option Strict:

默认情况下,Visual Basic .NET或Visual Basic编译器不强制执行严格的数据类型....在Visual Basic .NET中,通常可以隐式地将任何数据类型转换为任何其他数据类型.

所以这里发生的事情是VB编译器的"松散"特性让事情在运行时失败.C#在类型转换方面并没有那么宽松,这就是为什么它总是给出编译器错误,而VB则不然.使用Option Strict帮助在编译时而不是运行时识别这些错误.

如果不使用Option Strict,VB将允许任何转换/强制转换没有任何打嗝,但缩小转换,精度损失转换和完全无效转换会产生运行时错误.顶部发布的链接包含有关哪种类型转换被视为扩展的信息.