我是C#的初学者。我在我的项目中遇到了下面的代码片段。我不明白在没有传递任何参数的情况下如何调用ViewHelper.IsInView
。任何人都可以解释我这个。提前谢谢。
public static class ViewHelper
{
public static bool IsInView(IFrameworkElement element)
{
----------
}
}
var Result = Views.Any(ViewHelper.IsInView);
答案 0 :(得分:5)
Any
方法接受Func<T, bool>
形式的委托 - 指向函数的指针。这意味着它需要一个接受集合类型元素的方法(我在你的案例中猜测IFrameworkElement
)并返回一个bool
- 这正是{{1}的签名方法。
IsInView
方法然后对Any
集合中的元素执行此委托,直到遇到返回Views
的元素。
在C#中,存在来自&#34;方法组的隐式转换&#34;到委托类型。基本上,当你写
true
它转化为
Views.Any(ViewHelper.IsInView)
答案 1 :(得分:3)
传递给Enumerable.Any
的是委托,此时此方法尚未调用。如果有任何视图,则surf = cv2.SURF(400)
kp, des = surf.detectAndCompute(img,None)
将以一个或多个视图作为参数调用该委托。
您传递给Any
的代表是通过隐式方法组转换创建的。
Any
期待Views.Any
类型的委托,这意味着它需要Func<IFrameworkElement, bool>
类型的单个参数并返回IFrameworkElement
。您可以从方法创建此类委托,因为签名是兼容的。这就是显式执行此操作的方式:
bool
但是,从C#2.0开始,这样的转换可以隐式完成,这意味着这段代码完全相同:
Func<IFrameworkElement, bool> predicate =
new Func<IFrameworkElement, bool>(ViewHelper.IsInView);