【问题标题】:Generic List AddRange() type safety通用列表 AddRange() 类型安全
【发布时间】:2017-06-06 11:40:26
【问题描述】:

具有讽刺意味的是,在将一堆旧 Arraylist 转换为使用泛型 List(Of foo) 集合以提高类型安全性时,我在 List.AddRange() 方法中遇到了意外行为。

鉴于下面的代码,我本来预计会出现编译器错误,但我没有得到一个,并且项目一直运行到 AddRange 调用,其中 'Unable to cast List(Of bar) to List( of foo)' 抛出异常。

Dim barList As List(Of bar) = BarFunctionsLib.GetBarList()

Dim fooList As New List(Of foo)
fooList.AddRange(barList)

我尝试将 List(Of bar) 传递到 List(Of foo) 上的 AddRange 方法中的尝试不应该被编译器拾取吗?我没有通过我在 VS2015 中的编译器设置,也许它们过去被摆弄过,现在让它通过?

任何想法都将不胜感激,因为将 Arraylists 转换为通用 Lists 的全部理由是为了防止这样的错误。

【问题讨论】:

    标签: .net vb.net visual-studio generics


    【解决方案1】:

    您需要打开Option Strict 以获取有关此的编译器错误 - 最简单的方法是放置

    Option Strict On
    

    在源文件的顶部。

    对于现有项目,一个更强大的解决方案是转到您的项目属性,并在“编译”部分为您的项目全局设置它。

    然而,作为Tim mentioned in a comment,最好的解决方案是将您的设置更改为所有新 VB 项目的默认设置:

    【讨论】:

    • 将默认项目设置更改为option strict on 的最简单和最好的方法。 screenshot of option-setting
    • 太棒了,谢谢。经过多年的 c# 之后,我正在开发一个遗留的 VB.net 项目,而在为整个项目打开 Option Strict 后我发现让我感到非常难过...... sigh
    • 如果您关闭 Option Infer,您可能会发现更多信息 :-) 继续,您知道您想这样做!
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2021-06-30
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多