调用方法而不传递参数

时间:2016-07-30 15:00:33

标签: c#

我是C#的初学者。我在我的项目中遇到了下面的代码片段。我不明白在没有传递任何参数的情况下如何调用ViewHelper.IsInView。任何人都可以解释我这个。提前谢谢。

public static class ViewHelper
{
  public static bool IsInView(IFrameworkElement element)
  {
  ----------
  }
}

var Result = Views.Any(ViewHelper.IsInView);

2 个答案:

答案 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);