在out参数作为布尔值的方法上使用lambda

时间:2017-01-20 00:37:55

标签: c# lambda

我试图传递一个方法,该方法返回一个带有out参数的字符串作为布尔值。基于if返回字符串的方法,返回相同的字符串。

由于lambda无效而无法工作的准系统示例代码:

class Class1 {
    void Foo () {
        s = "some value";
        if (() => { (Class2.Foo(s, out s)); })
            return; // Do stuff here
    }
}

public static class Class2 {
    string Foo(string s, out string _s) {
        bool ok = true; // HACK
        _s = "";
        return ok ? _s : s;
    }
}

如果可能的话,如何只通过更改/替换lambda表达式来正常工作?

编辑:似乎我一直在问这个有点倒退和愚蠢。以下是我试图完成的更广泛的版本:

我想向一个方法发送一个任何类型的对象,并返回相同的对象,如果函数成功则获取一个新对象。然后我想将方法​​本身用作布尔值,因此if语句中的代码只有在我得到一个新对象时才会运行。

我意识到这是一种奇怪的方法,但这种废话背后有一种方法(至少在我脑海中)。

1 个答案:

答案 0 :(得分:0)

您无法直接将值与lambda表达式进行比较。你可以做的是将lambda包装在Func中并检查结果:

if (new Func<string>(() => Class2.Foo(s, out s)).Invoke() == "some value")
{
    // Do stuff
}

但是,您的代码中并不清楚为什么您正在使用lambda。如果可能,您应该只调用方法:

if (Class2.Foo(s, out s) == "some value")
{
    // Do stuff
}

根据评论中的澄清,我认为最好做两件事之一。要么A]只有一个ref参数,要在方法中进行分配(通过泛型辅助清洁):

class Class1 
{
    void Foo () 
    {
        s = "some value";
        sa = "some other value";

        if (Class2.Foo(ref s, sa))
        {
            // Do stuff here
        }
    }
}


public static class Class2 
{
    public static bool Foo<T>(ref T o, T alt) {
        bool ok = // Do some function

        if (ok)
            o = alt;

        return ok;
    }
}

或B]从方法中获取正确的对象:

class Class1 
{
    void Foo () 
    {
        sa = "some value";
        sb = "some other value";
        r = Class2.Foo(sa, sb);

        if (r != sa)
        {
            // Do stuff here
        }
    }
}

public static class Class2 
{
    public static T Foo<T>(T a, T b) 
    {
        bool ok = // Do some function

        if (ok)
            return a;

        return b;
    }
}

目前还不清楚为什么你需要一个lambda,但如果你这样做,你可以简单地将它包裹在Func(根据我的上述答案)或Predicate(根据Mrinal Kamboj's)回答)。