这些VB实现有什么区别?

时间:2011-08-08 10:20:43

标签: .net vb.net exception

旨在实现: 我想在列表的每个成员的末尾添加prevMonth的名称。

我有两个相同的实现,1个工作,但其他的是异常。

工作代码:

prevMonthSheetNames = addMonth(monthlySheetNames, prevMonth)

Private Function addMonth(ByVal list As IEnumerable(Of String), ByVal month As String) As List(Of String)
    Return list.Select(Function(name) String.Concat(name) + " (" + month + ")").ToList()
End Function

使用例外实施:

prevMonthSheetNames = monthlySheetNames.Select(Function(name) String.Concat(name) + " (" + prevMonth + ")").ToList()
  

错误:'System.Collections.Generic.List(Of Object)'类型的值无法转换为'System.Collections.Generic.List(Of String)'

如果我从上面删除.ToList(),那么:

  

异常:无法转换'WhereSelectListIterator 2[System.String,System.Object]' to type 'System.Collections.Generic.List 1 [System.String]'类型的对象。

请帮助,发生了什么 - 似乎是相同的,但是1给出了错误而其他没有?

monthlySheetNames声明:

Private monthlySheetNames As New List(Of String)(New String() {"Salary", "Budget", "Loans"}) 

3 个答案:

答案 0 :(得分:3)

在第二个示例中,匿名函数返回Object而不是String,因此投射失败。

首先,转到项目属性,并确保项目属性编译标签上的Option Strict 开启

然后,仔细查看prevMonth声明 你怎么分配它?它的类型是什么?你确定它是String吗?

使用lambda expression来确保它返回String也可能有所帮助。对,它有点混乱:

Function(name) String.Concat(name) + " (" + prevMonth + ")"

String.Concat连接参数,你只给它一个。这个电话没用 另外,如果prevMonth实际上不是String,我不确定VB .NET将如何应用+运算符。

毕竟,使用String.Format suggested by Smudge002会更简单(更安全):

Function(name) String.Format("{0} ({1})", name, prevMonth)

至少,您确定 返回String

答案 1 :(得分:2)

问题可能与您使用'+'运算符有关。你应该使用'&'用于在VB.Net中连接。此外,使用String.Concat函数是多余的 - 它不会有任何影响。试试这个。

Option Explicit On
Option Strict On

prevMonthSheetNames = monthlySheetNames.Select(Function(name) name & " (" & prevMonth & ")").ToList()

我不确定两个版本之间的区别是什么。可能是,这是由于参数值的隐式转换。我在代码示例中包含了一些语句,这些语句将确保启用Option Strict和Option Explicit。这可能有助于解决这些问题。

答案 2 :(得分:2)

试试这个......

Public Function GetSheetNamesForMonth(byval sheetNames As IEnumerable(Of String), Byval monthName As String) As IEnumerable(Of String)
    Return sheetNames.Select(Function(n) String.Format("{0}({1})", n, monthName))
End Function