使用返回的属性

时间:2017-02-23 14:33:42

标签: arrays vb.net properties

我想设置数组的值,我从函数返回属性。

属性:

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"}

2 个答案:

答案 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

请注意,那些rangeresult变量仍然具有显式类型,因为类型推断和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()