2013-11-26 3 views
1

Я пытаюсь использовать метод Where на сборе в этом перегруженном методе:Почему я не могу использовать метод для этого параметра?

Private Function getIndexOfObjectById(Of T)(ByVal collection As SortableBindingList(Of T), ByVal id As Integer) 
    Dim cy = collection.Where(Function(c) c.id = id).FirstOrDefault() 
    Return collection.IndexOf(cy) 
End Function 

Но я получаю сообщение об ошибке, даже если я знаю, что существует способ:

Error 1 Overload resolution failed because no accessible 'Where' can be called with these arguments: 
    Extension method 'Public Function Where(predicate As System.Func(Of T, Integer, Boolean)) As System.Collections.Generic.IEnumerable(Of T)' defined in 'System.Linq.Enumerable': Nested function does not have a signature that is compatible with delegate 'System.Func(Of T, Integer, Boolean)'. 
    Extension method 'Public Function Where(predicate As System.Func(Of T, Boolean)) As System.Collections.Generic.IEnumerable(Of T)' defined in 'System.Linq.Enumerable': 'id' is not a member of 'T'. \\... 5693 18 

ответ

4

компилятор никоим образом не гарантируйте, что ваш общий тип T будет иметь свойство с именем «id». Поэтому выражение c.id в вашем вызове Where() не является законным, поскольку это свойство может не существовать.

Чтобы это исправить, нужно ограничить ваш универсальный метод в какой-то интерфейс, который обещает id целого свойства будет доступно, есть способ задать для функции, которая будет проецировать ваш тип T к id, или использовать некоторые другой трюк, который позволит компилятору узнать больше о вашем типе или проекции типа на целое число.

+0

Есть ли решение, которое не использует сильную печать? Я попытался, и когда я удалил типизированные параметры, я получил исключение во время выполнения, заявив, что у моей коллекции не было метода «Где». –

+0

Если вы не хотите сильного ввода текста, вы используете неправильную платформу. Я имею в виду, что вы можете сделать эту работу динамичной, но это действительно для краевых случаев. Это вызовет удар производительности для поиска по времени выполнения и оставит вас открытыми для ошибок, которые проявляются во время выполнения, если метод вызывается с неправильным аргументом. –

Смежные вопросы