在方法中传递关系运算符作为参数

问题描述 投票:0回答:1

我是一个新手。我想做这样的事情。

private int myLoop (int start, int end, string relationalOperator)
{
        int count = 0;

        for (int i = start; i <= end; i++)
        {
                if ( X +relationalOperator+ Y) 
                    count++;
        }
        return count;
}

And then do:

myLoop(1,10,>=);

这样我就可以传递一个关系运算符作为参数。如何才能做到这一点?

c# methods arguments operator-keyword
1个回答
2
投票

不,你不能这样做。参见例如 为什么不可以传递一个操作符作为参数?

然而,你 可以 传递一个委托。这实际上会更灵活,因为调用者可以使用更复杂的逻辑,而不是简单的一些比较运算符。但这通常不会是个问题。

在你的例子中,它可能看起来像这样。

private int myLoop (int start, int end, Func<int, int, bool> op)
{
    int count = 0;

    for (int i = start; i <= end; i++)
    {
        if (op(X, Y))
            count++;
    }
    return count;
}

你会这样使用它:

myLoop(1, 10, (x, y) => x >= y);

(我不知道是什么) XY 在你原来的例子中应该代表什么,所以我只是把这些保持原样。你可以使用任何 int 值,你喜欢那里)。)

Func<int, int, bool> 是一个 委托 类型,它是一种函数指针。即它可以指向一个要执行的函数。这种特殊的委托类型是内置在.NET中的,它代表了任何需要两个 int 参数,并返回一个 bool 值。您也可以使用下面的命令来声明您自己的委托类型。delegate 关键字。见 代表(C#编程指南).

委托实例可以通过多种方式创建。在上面的例子中。(x, y) => x >= y 是一个 羔羊座 表达式。C#编译器将其转化为一个 匿名方法 在这个特定的例子中,它接受两个参数,并评估表达式 x >= y 使用这些参数,并返回结果。参数类型被推断为 int 由编译器根据上下文,在本例中是你要调用的方法。

© www.soinside.com 2019 - 2024. All rights reserved.