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

时间:2015-11-06 15:32:09

标签: c# vb.net compiler-errors

比较这个C#(fiddle

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 {}

到这个VB(fiddle)。

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

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

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

可能与Why no compiler error when I cast a class to an interface it doesn't implement?

有关

1 个答案:

答案 0 :(得分:6)

this page关于Option Strict

  

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

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

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