述語の変換 Funcに 質問する

述語の変換 Funcに 質問する

PredicateLinq 式で使用したいメンバーを持つクラスがあります。

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));
}

もちろん、他の回答で提案されているラムダ式のアプローチも機能します。

おすすめ記事