我试图传递一个方法,该方法返回一个带有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语句中的代码只有在我得到一个新对象时才会运行。
我意识到这是一种奇怪的方法,但这种废话背后有一种方法(至少在我脑海中)。
答案 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)回答)。