Метод расширения и ограничения типа - PullRequest
3 голосов
/ 13 сентября 2010

Я начинаю играть с методами расширения, и я столкнулся с этой проблемой: В следующем сценарии я получаю:

"метод расширения имеет ограничение типа, которое никогда не может быть выполнено"

Public Interface IKeyedObject(Of TKey As IEquatable(Of TKey))
    ReadOnly Property InstanceKey() As TKey 
End Interface

<Extension()> _
Public Function ToDictionary(Of TKey As IEquatable(Of TKey), tValue As IKeyedObject(Of TKey))(ByVal l As IEnumerable(Of tValue)) As IDictionary(Of TKey, tValue)
     'code
End Function

Но это работает, если я заменю IKeyedObject (Of k) на IKeyedObject (Of Integer)

  <Extension()> _
    Public Function ToDictionary(Of TKey As IEquatable(Of TKey), tValue As IKeyedObject(Of TKey))(ByVal l As IEnumerable(Of tValue)) As IDictionary(Of TKey, tValue)
        'code
    End Function

Я что-то упустил? В любом случае я могу делать то, что я хочу здесь?

Заранее спасибо

1 Ответ

4 голосов
/ 13 сентября 2010

Метод расширения '' имеет ограничения по типу, которые никогда не могут быть выполнены.

Я прочитал следующее об этой ошибке вкл.MSDN :

Поскольку метод является методом расширения, компилятор должен иметь возможность определять тип данных или типы, которые метод расширяет, основываясь только на первом параметрев объявлении метода [...]

В вашем случае компилятор должен иметь возможность выводить как TKey, так и TValue из параметра l, что невозможно.Таким образом, предупреждение компилятора.


Какой вид имеет смысл.В конце концов, представьте, как вы собираетесь вызывать свой метод расширения:

Dim values As IEnumerable(Of TValue) = ...

Dim dictionary As IDictionary(Of ?, TValue) = values.ToDictionary()
'                                ^                                            '
'                                where does the compiler get this type from?  '

По общему признанию, компилятор мог бы вывести параметр другого типа, позволяя вам явно указать его, как values.ToDictionary(Of TKey)(), но, очевидно,не позволяет этого.

...