I have a class with a member Predicate
which I would like to use in a Linq expression:
using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable<Instrument> m_instrumentList; private Predicate<Instrument> m_filterExpression; }
As I read that "Predicate<T>
is [...] completely equivalent to Func<T, bool>
" (see here), I would expect this to work, since All
takes in as argument: Func<Instrument, bool> predicate
.
However, I get the error:
Argument 2: cannot convert from 'System.Predicate<MyNamespace.Instrument>' to 'System.Type'
Is there a way to convert the predicate to an argument that this function will swallow?
The two types represent the same logical signature, but that doesn't mean they're just interchangable. A straight assignment won't work, for example - but you can create a new Func<T, bool>
from the Predicate<T, bool>
. Sample code:
Predicate<string> pred = x => x.Length > 10; // Func<string, bool> func = pred; // Error Func<string, bool> func = new Func<string, bool>(pred); // Okay
This is a bit like having two enum
types with the same values - you can convert between them, but you have to do so explicitly. They're still separate types.
In your case, this means you could write:
public bool DoAllHaveSomeProperty() { return m_instrumentList.All(new Func<T, bool>(m_filterExpression)); }
The lambda expression approach suggested by other answers will work too, of course.
public bool DoAllHaveSomeProperty() { return m_instrumentList.All(i => m_filterExpression(i)); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With