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
相关产品推荐
相关产品推荐

