我想设置数组的值,我从函数返回属性。
属性:
Public Property Labels()() As String()
功能:(最近3天返回)
Public Function LabelDays(count As Integer)
Dim days(count)
days(0) = Date.Now.ToString("ddd")
count -= 1
If count > 0 Then
For i As Integer = 0 To count
days(i) = DateAdd(DateInterval.Day, i * -1, Date.Now).ToString("ddd")
Next
End If
Return days
End Function
使用:
Labels = LabelDays(3)
我得到的错误如“对象无法转换为字符串”。 如果我直接设置值,它就可以工作。
'Labels = New String() {"We", "Tu", "Mo"}
答案 0 :(得分:0)
您的日期数组定义中缺少As String
,因此您在函数中返回的数组是一个对象数组。只需更改此行:
Dim days(count)
进入这个:
Dim days(count) As String
还值得注意的是,您正在创建另外一个需要的项目数组,因此该行实际应该是:
Dim days(count-1) As String
答案 1 :(得分:0)
现有代码将0
索引设置两次,而count
值设置为3将尝试设置四个索引(0,1,2和3) 。但具体错误是因为您没有为days
数组设置数据类型。如果没有显式类型,编译器将选择Object
。然后,当您尝试将其分配给字符串时,您会从问题中收到Object cannot be converted to String
错误。函数定义也缺少类型。
始终设置变量的数据类型,即使它只是使用类型推断。您应该通过启用Option Strict !
来强制执行此操作您还可以将整个功能简化为一行:
Function LabelDays(ByVal Count As Integer) As String()
Return Enumerable.Range(0, Count).Select(Function(d) Today.AddDays(d * -1).ToString("ddd")).ToArray()
End Function
虽然为了便于阅读和维护,但我会稍微分解一下:
Function LabelDays(ByVal Count As Integer) As String()
Dim range = Enumerable.Range(0, Count)
Dim result = range.Select(Function(d) Today.AddDays(d * -1).ToString("ddd"))
Return result.ToArray()
End Function
请注意,那些range
和result
变量仍然具有显式类型,因为类型推断和Option Infer
,并且因为我在声明它们的同时分配了它们。
您还可以使用迭代器获得乐趣:
Iterator Function LabelDays(ByVal Count As Integer) As IEnumerable(Of String)
Dim current = Today
While Count > 0
Yield current.ToString("ddd")
current = current.AddDays(-1)
Count -= 1
End While
End Function
然后像这样称呼它:
Labels = LabelDays(3).ToArray()