比较这个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?
有关答案 0 :(得分:6)
this page关于Option Strict
:
默认情况下,Visual Basic .NET或Visual Basic编译器不强制执行严格的数据输入。 ...在Visual Basic .NET中,您通常可以将任何数据类型转换为任何数据类型隐式的其他数据类型。
所以这里发生的事情是VB编译器的“松散”特性让事情在运行时失败。 C#在类型转换方面并没有那么宽松,这就是为什么它总是给出编译器错误,而VB则不然。使用Option Strict
有助于在编译时识别这些错误,而不是运行时。
不使用Option Strict
,VB将允许任何转换/强制转换没有任何打嗝,但缩小转换,精度损失转换和完全无效转换会产生运行时错误。顶部发布的链接包含有关哪种类型转化被视为扩展的信息。