4

我正在实现一个图形类。在课堂上我了解到广度优先和深度优先遍历是相同的算法,除了存储遍历节点分别使用队列和堆栈。因此,我将所有逻辑放入一个 Traversal() 方法中,该方法由 DepthFirstSearch() 调用,该方法作为 ADT 在堆栈中传递。

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 传递给委托,因为它是一个类属性?所以为了解决这个问题,我使用了一个 lambda 来关闭该属性。但是谁能解释为什么我需要 lambda 用于 s.Count 而不是 s.Pop 或 s.Push?谢谢。

4

1 回答 1

4

原因是Stack<T>.Push并且Stack<T>.Pop已经是与您尝试分配方法的委托类型兼容的函数(Func<TResult>并且Action<T>,在您的情况下,TResultT您的泛型类型参数匹配,Stack<T>在您的情况下, )。GraphNode<T>如果它们不兼容,您将需要使用 lambda 函数或某种其他类型的包装委托将方法分配给您的委托变量。

虽然类属性在技术上由 getter 和 setter 方法组成,但在 C# 中,这些细节被抽象掉了,需要您将类属性包装在 lambda 函数中。此外,根据下面 Servy 的评论,编译器将无法轻松确定您是在尝试将 getter 还是 setter 分配给委托变量。

于 2012-11-22T01:12:35.380 回答