使用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会自动匹配正确的重载,遍历列表元素进行拼接。
怎么修复?
这里给你几个更优雅的解决办法:
显式强转,确保类型正确
从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接受字符数组参数),比传字符串更准确。在Razor中显式指定类型
如果没法修改后台代码,在Razor视图里强制把MyList转换成IEnumerable(Of String),让String.Join找到正确的重载:List: @String.Join(" | ", CType(MyList, IEnumerable(Of String)))开启Option Strict On
这是个长期的好习惯,它会强制你进行显式类型转换,从根源上避免这类隐式转换的问题。你可以在项目设置里开启,或者在代码文件顶部添加:Option Strict On
内容的提问来源于stack exchange,提问作者Drew

