gpt4 book ai didi

c# - 使用 Func 捕获类属性

转载 作者:行者123 更新时间:2023-12-01 01:13:36 26 4
gpt4 key购买 nike

我正在实现一个图形类。在类里面我了解到广度优先和深度优先遍历是相同的算法,除了存储遍历节点分别使用队列和堆栈。因此,我将所有逻辑放入一个 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 传递给委托(delegate),因为它是一个类属性?所以为了解决这个问题,我使用了一个 lambda 来关闭该属性。但是谁能解释为什么我需要 lambda 用于 s.Count 而不是 s.Pop 或 s.Push?谢谢。

最佳答案

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

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

关于c# - 使用 Func 捕获类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com