2012-02-20 19 views
2

在下面的代碼,什麼VB.Net每個迴路看看推斷類型

For Each item in MyCollection 
... 
Next 

什麼編譯器使用,以確定item類型?

比如讓說我有這個類,它繼承了非泛型集合,

Public Class BaseDataObjectGenericCollection(Of T) 
    Inherits BaseDataObjectCollection 
End Class 

每個循環仍然推斷項目類型爲Object。我將如何修改上述類以使類型推斷工作?

編輯:Per Beatles1692的回答,實現IEnumerator(Of T)有點作品。該基類已經有一個GetEnumerator功能,從CollectionBase繼承,所以我我實現這個樣子,

Public Function GetEnumerator1() As System.Collections.Generic.IEnumerator(Of T) Implements System.Collections.Generic.IEnumerable(Of T).GetEnumerator 
     Return MyBase.Cast(Of T)().GetEnumerator 
    End Function 

然而,在for循環依然推斷類型爲對象。但是,如果我將接口實現更改爲此,

Public Shadows Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of T) Implements System.Collections.Generic.IEnumerable(Of T).GetEnumerator 
     Return MyBase.Cast(Of T)().GetEnumerator 
    End Function 

這樣做,for循環獲取類型推斷正確。所以我想現在的問題是,For Each只是尋找一個名爲GetEnumerator的函數?

回答

1

嗯,有隻有一個地方可去像這樣的問題。規格!

第10.9.3節討論For Each語句。據此:

如果使用局部變量類型推斷,則標識符定義一個新的局部變量,其範圍是整個For循環,其類型是集合的元素類型(如果枚舉器表達式類型爲Object)。

「收集」在這裏看起來很模糊,但它在下一頁中有明確的定義。基本上,類型必須具有GetEnumerator()調用,並且此枚舉器必須(a)具有返回布爾類型的MoveNext()方法,以及(b)具有Current屬性。 Current屬性的類型是由編譯器推斷的類型。請注意,它實際上與IEnumerator或IEnumerable無關......你只需要符合規定的模式。考慮以下代碼:

Option Infer On 

Public Module M 
    Sub Main() 
     For Each x In New SomeClass() 

     Next 
    End Sub 
End Module 

Public Class SomeClass 
    Public Function GetEnumerator() As MyEnumerator 
     Return New MyEnumerator() 
    End Function 
End Class 


Public Class MyEnumerator 
    Public ReadOnly Property Current As Integer 
     Get 
      Return 42 
     End Get 
    End Property 

    Public Function MoveNext() As Boolean 
     Return True 
    End Function 
End Class 

Sub Main()中的「x」類型是Integer,因爲Current屬性返回Integer。

+1

現在一切都有意義。我必須記得下次檢查規格。我總是依靠谷歌從混亂的詞彙中找出我想要的。 – Kratz 2012-02-21 17:20:20

1

要麼你應該寫:

For Each Item As SpecificType In MyCollection 
.... 
Next 

然後,它會投項目中的每個循環中SpecificType或您的收藏應該已經實現了IEnumerable(Of T)已

+0

是的,但不是我所問的。我想知道編譯器如何推斷類型,何時不提供。 – Kratz 2012-02-20 23:16:05

+0

我編輯了我的答案 – Beatles1692 2012-02-20 23:23:16

+0

好的,我會給你的。看到我編輯的答案,當我嘗試了它,我得到了一些奇怪的結果。仍然好奇,如果有人知道編譯器在做什麼。 – Kratz 2012-02-20 23:35:48