【问题标题】:Pass Relational Operator as an argument in Method将关系运算符作为参数传递给方法
【发布时间】:2020-09-01 23:17:18
【问题描述】:

我是新手。我想做类似的事情:

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;
}

然后做:

myLoop(1,10,>=);

所以我可以将关系运算符作为参数传递。这怎么可能?

【问题讨论】:

    标签: c# methods arguments operator-keyword


    【解决方案1】:

    不,你不能。参见例如Why is it not possible to pass an operator as an argument?

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

    在您的示例中,它可能看起来像这样:

    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&lt;int, int, bool&gt; 是一个 delegate 类型,它是一种函数指针。 IE。它可以指向要执行的函数。该特定委托类型内置于 .NET 中,它代表任何采用两个 int 参数并返回 bool 值的方法。您还可以使用 delegate 关键字声明您自己的自定义委托类型。见Delegates (C# Programming Guide)

    可以通过多种方式创建委托实例。在上面的示例中,(x, y) =&gt; x &gt;= y 是一个 lambda 表达式。 C# 编译器将其转换为 匿名方法,在此特定示例中,该方法采用两个参数,使用这些参数计算表达式 x &gt;= y,然后返回结果。参数类型由编译器根据上下文推断为int,在本例中为您正在调用的方法。

    【讨论】:

      猜你喜欢
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2018-03-27
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多