为什么不';t VB编译器捕获到对接口类型的无效隐式转换,而C#则捕获到

本文关键字:无效 转换 VB 为什么不 编译器 接口类型 | 更新日期: 2023-09-27 18:20:48

比较这个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(小提琴)。

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中,代码会编译,但在运行时失败。

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

可能与当我将一个类转换为它没有实现的接口时为什么没有编译器错误有关?

为什么不';t VB编译器捕获到对接口类型的无效隐式转换,而C#则捕获到

从此页面了解Option Strict:

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

因此,这里发生的是VB编译器的"松散"特性,它允许在运行时失败的事情通过。C#对类型转换并不那么宽松,这就是为什么它总是会给出编译器错误,而VB则不会。使用Option Strict有助于在编译时而不是运行时识别这些错误。

在不使用Option Strict的情况下,VB将允许进行任何转换/强制转换,而不会出现任何问题,但缩小转换范围、丢失精度的转换和完全无效的转换将出现运行时错误。顶部发布的链接提供了哪些类型的转换被视为正在扩展的信息。