Predicate
Linq 式で使用したいメンバーを持つクラスがあります。
using System.Linq;
class MyClass
{
public bool DoAllHaveSomeProperty()
{
return m_instrumentList.All(m_filterExpression);
}
private IEnumerable<Instrument> m_instrumentList;
private Predicate<Instrument> m_filterExpression;
}
「Predicate<T>
」はFunc<T, bool>
「(こちらをご覧くださいAll
) は、を引数として受け取るので、これが機能すると予想されますFunc<Instrument, bool> predicate
。
しかし、次のエラーが発生します:
Argument 2: cannot convert from 'System.Predicate<MyNamespace.Instrument>' to 'System.Type'
述語をこの関数が取り込む引数に変換する方法はありますか?
ベストアンサー1
2 つの型は同じ論理シグネチャを表しますが、それは単に交換可能であるという意味ではありません。たとえば、直接の割り当ては機能しませんが、Func<T, bool>
から新しい を作成できますPredicate<T, bool>
。サンプル コード:
Predicate<string> pred = x => x.Length > 10;
// Func<string, bool> func = pred; // Error
Func<string, bool> func = new Func<string, bool>(pred); // Okay
これは、同じ値を持つ 2 つの型があるようなものですenum
。これらの型間で変換することはできますが、明示的に行う必要があります。これらは依然として別々の型です。
あなたの場合、これは次のように書くことができることを意味します:
public bool DoAllHaveSomeProperty()
{
return m_instrumentList.All(new Func<T, bool>(m_filterExpression));
}
もちろん、他の回答で提案されているラムダ式のアプローチも機能します。