4

グラフクラスの実装に取り​​組んでいます。クラスでは、幅優先と深さ優先のトラバーサルは、トラバースノードを格納することを除いて同じアルゴリズムであり、それぞれキューとスタックが使用されることを学びました。そこで、すべてのロジックを、スタックをADTとして渡すDepthFirstSearch()によって呼び出されるTraversal()メソッドに入れます。

public void DepthFirstSearch(GraphNode<T> root)
{
    Stack<GraphNode<T>> s = new Stack<GraphNode<T>>();

    Action<GraphNode<T>> insert = s.Push;
    Func<GraphNode<T>> retrieve = s.Pop;
    //Func<int> stackCount = s.Count; Cannot implicitly convert type 'int' to System.Func<int>' error
    Func<int> stackCount = () => s.Count;

    Traversal(root, insert, retrieve, stackCount);
}

クラスプロパティであるため、s.Countをデリゲートに渡すことができないと想定していますか?それで、それを回避するために、私はラムダを使用してそのプロパティの周りを閉じました。しかし、s.Popやs.Pushではなくs.Countにラムダが必要な理由を誰かが説明できますか?ありがとう。

4

1 に答える 1

4

その理由は、Stack<T>.PushStack<T>.Popすでに、メソッドを割り当てようとしているデリゲートのタイプ(Func<TResult>およびAction<T>、ここで、およびは、のジェネリック型パラメーターTResultと一致する)と互換性のある関数であるためです。互換性がない場合は、ラムダ関数または他の種類のラッパーデリゲートを使用して、メソッドをデリゲート変数に割り当てる必要があります。TStack<T>GraphNode<T>

クラスプロパティは技術的にはgetterメソッドとsetterメソッドで構成されますが、C#では、これらの詳細が抽象化されるため、クラスプロパティをラムダ関数でラップする必要があります。また、以下のServyのコメントによると、コンパイラーは、ゲッターとセッターのどちらをデリゲート変数に割り当てようとしているのかを簡単に判断できません。

于 2012-11-22T01:12:35.380 に答える