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

使用String.Join拼接String数组时返回System.String[],问题出在哪?

问题原因与解决方案

嘿,我太熟悉这个坑了!你看到的System.String[]其实是数组对象默认的ToString()结果,问题出在你调用了String.Join的错误重载方法。

为什么会这样?

虽然你声明了MyList As String(),但因为VB.NET默认可能开启了Option Strict Off(允许隐式类型转换),从DataRow里取到的dr("someColumnn")是Object类型,后续的Trim、Split操作虽然返回了字符串数组,但在传递到Razor视图时,变量的类型信息可能被隐式转换成了Object。这时候String.Join会调用Join(String, Object)这个重载——它不会把Object当成数组来遍历,而是直接调用数组的ToString(),结果自然就是System.String[]了。

而你的临时方法能生效,是因为List(Of String)明确实现了IEnumerable(Of String),String.Join会自动匹配正确的重载,遍历列表元素进行拼接。

怎么修复?

这里给你几个更优雅的解决办法:

  1. 显式强转,确保类型正确
    从DataRow取值时先转换成字符串,避免隐式转换的坑,同时处理可能的DBNull情况:

    ' 先处理数据库值,避免DBNull导致的异常
    Dim columnValue As String = If(dr("someColumnn") Is DBNull.Value, "", CStr(dr("someColumnn")))
    ' 显式转换后再拆分,确保MyList是明确的String()类型
    Dim MyList As String() = columnValue.Trim().Trim(","c).Split(","c)
    

    注意这里用","c指定字符(VB.NET中Trim接受字符数组参数),比传字符串更准确。

  2. 在Razor中显式指定类型
    如果没法修改后台代码,在Razor视图里强制把MyList转换成IEnumerable(Of String),让String.Join找到正确的重载:

    List: @String.Join(" | ", CType(MyList, IEnumerable(Of String)))
    
  3. 开启Option Strict On
    这是个长期的好习惯,它会强制你进行显式类型转换,从根源上避免这类隐式转换的问题。你可以在项目设置里开启,或者在代码文件顶部添加:

    Option Strict On
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:05:58