You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.Net 开启Option Strict时如何禁止For Each的隐式收缩转换

解答

简短回答:没有方法可以阻止该问题

这是Visual Basic的固有设计,即使开启Option Strict On,也不会在编译期拦截For Each循环中的这类类型转换。

原因说明

  • 你在GetFirstApple里直接把Fruit类型的元素赋值给Apple类型的返回值,属于显式的窄化类型转换,Option Strict On会直接识别出这种不安全转换,所以抛出编译错误,符合你的预期。
  • 而For Each循环的迭代变量类型转换属于VB的历史兼容设计:编译器默认假设你已经确认集合内所有元素都匹配迭代变量的类型,只会在运行时实际遍历到类型不匹配的元素时抛出InvalidCastException,不会在编译期做校验。

替代规避方案

如果你要避免运行时错误,可以用OfType扩展方法先过滤集合里类型匹配的元素,修改后的GetApples方法如下:

Public Function GetApples() As List(Of Apple)
    Dim result As New List(Of Apple)
    ' 先过滤所有Apple类型的元素再遍历,不会触发运行时类型错误
    For Each A As Apple In Me._fruits.OfType(Of Apple)()
        result.Add(A)
    Next
    Return result
End Function

也可以直接用LINQ简化写法:

Public Function GetApples() As List(Of Apple)
    Return Me._fruits.OfType(Of Apple).ToList()
End Function

内容的提问来源于stack exchange,提问作者Wolfgang Amadeus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:45:02