1

假设我有这个类:

class Foo
 Public Property a() As Integer
 Private _l As List(Of Integer) = New List(Of Integer)
 Public Property l() As List(Of Integer)
    Get
     Return _l
    End Get
    Set(value As List(Of Integer))
     _l = value
    End Set
 End Property    
end class

我正在尝试使用初始化列表来初始化属性:

Dim f as Foo = New Foo With {.a = 1, .l.Add(1)}

以上不起作用。我在这里有点困惑。现在,在我理解的初始化列表中,我可以像这样初始化集合:

Dim f as Foo = New Foo With {.a = 1, .l = New List(Of Integer){1}}

但是我需要做的,因为_l当我说的时候已经指向一个对象New Foo,所以只添加元素而不说..., .l = New List(Of Integer){1}} 。为什么它不起作用?

4

2 回答 2

2

可以使用集合初始化语法,即Dim f As New Foo From {1, 2, 3}(见下文)。但是,这有一些缺点:

  • 您不能同时使用集合初始值设定项语法和对象初始值设定项(例如With {.a = 1})。因此,您必须将属性a的初始化移至构造函数。
  • 你的类必须实现IEnumerable并且有一个Add方法。

也就是说,这是一个工作示例:

Class Foo
    Implements IEnumerable

    Public Property a() As Integer
    Private _l As List(Of Integer) = New List(Of Integer)
    Public Property l() As List(Of Integer)
        Get
            Return _l
        End Get
        Set(value As List(Of Integer))
            _l = value
        End Set
    End Property

    Public Sub New(ByVal a As Integer)
        Me.a = a
    End Sub

    Public Sub Add(ByVal item As Integer)
        _l.Add(item)
    End Sub

    Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
        Return _l.GetEnumerator()
    End Function
End Class

它可以按如下方式使用:

Dim f As New Foo(1) From {1, 2, 3}   ' sets a to 1 and adds 1, 2 and 3 to the list
于 2012-07-30T11:55:05.633 回答
0

我认为这是因为你不能同时初始化和添加一个元素到列表中。

作为一种解决方案,您可以向您的类添加一个构造函数:

Public Sub New(ByVal lValue As Integer)
    l.Add(lValue)
End Sub

然后你可以在一行中完成这一切:

Dim f As Foo = New Foo(1) With {.a = 1}
于 2012-07-30T11:43:44.890 回答