C# 是否有一些技巧可以使用';输出';lambda函数中的参数? if((新函数((/*out*/string uname)=>。。。。

C# 是否有一些技巧可以使用';输出';lambda函数中的参数? if((新函数((/*out*/string uname)=>。。。。,c#,lambda,C#,Lambda,更多细节:这是登录函数的一部分,我只希望我的lambda函数使用out参数更改登录名user,并告诉我该用户使用bool return登录 我真的明白,我可以返回元组,然后获取字符串值,但为了个人清晰起见,我需要精确的out参数。如果用户未登录,我最好只返回null字符串,只是想知道我是否可以在lambda函数中使用out参数 我真的了解到,语句位置上带有表达式的代码不是很干净,但没有人告诉我这对编译器是否真的不好。Lambda表达式不起作用,但对于代理,您应该可以使用语句体: if ( (ne

更多细节:这是登录函数的一部分,我只希望我的lambda函数使用out参数更改登录名user,并告诉我该用户使用bool return登录

我真的明白,我可以返回元组,然后获取字符串值,但为了个人清晰起见,我需要精确的out参数。如果用户未登录,我最好只返回null字符串,只是想知道我是否可以在lambda函数中使用out参数

我真的了解到,语句位置上带有表达式的代码不是很干净,但没有人告诉我这对编译器是否真的不好。

Lambda表达式不起作用,但对于代理,您应该可以使用语句体:

if ( (new Func</*out*/ string, bool>( (/*out*/ string uname) => ....

不能使用带有lambda表达式的out参数。参见.p/>>P>虽然你不能使用out关键字,但我确实找到了一个解决方案,它可以让你基本上在.NET中实现C++风格的内存指针。

public delegate bool MyType(out string value);
公共类Ptr
{
Func吸气剂;
行动设定者;
公共Ptr(职能,行动s)
{
getter=g;
setter=s;
}
公共交通费
{
获取{return getter();}
集合{setter(value);}
}
}
用法示例

public class Ptr<T>
{
    Func<T> getter;
    Action<T> setter;

    public Ptr(Func<T> g, Action<T> s)
    {
        getter = g;
        setter = s;
    }

    public T Deref
    {
        get { return getter(); }
        set { setter(value); }
    }
}
private IDocumentSession\u session=DocumentStore.OpenSession()
var ptr=新ptr(
()=>\u会议,
newValue=>_session=newValue))
session.Deref.SaveChanges();
session.Deref=DocumentStore.OpenSession();

我在一个批处理程序中使用了它,当我需要细粒度的会话控制时,它允许批处理操作控制RavenDB的会话刷新,同时也保留了一个环境会话上下文。警告一句,我不知道这种类型的代码在长时间运行的生产应用程序中会有什么影响,因为我不确定这是否会混淆ode>GC并导致内存永远不会被回收。

所以…我真的不想在这里使用委托,但我甚至不知道它们在这里是否可以正常工作。不,你确实需要委托,只是可能不需要lambda表达式。好的,是的,我需要:)如果((新的ChUname((out string uname)=>)工作正常。这仍然是lambda。你不能有(out string usname)=>…忘记lambda,读一下基本的委托用法。但是它工作得很好,ChUname是我的委托,它可以更改我的用户名。有点混乱。你可以使用类似于
(int i,out int j)的lambda=>…
,其中包含
out
关键字,并且可以将lamda分配给委托类型的变量。但是,它不能分配给表达式树。您所指的问题是,在lambda中捕获正则方法的
out
参数。这类似于
公共静态bool UsualMethod(out int i){/*普通方法的主体*/Action f=()=>{Console.WriteLine(i);};…}
。这是非法的。lambda试图捕获包含方法的
out
参数。注意,这样lambda表达式可以具有
ref/out
参数。例如,这起作用:
委托布尔记录器(out字符串名称);记录器f=(输出字符串栏)=>{bar=”“;//分配返回…};
。仅凭
操作/Func
您无法完成此操作。您需要自己的委托。
public class Ptr<T>
{
    Func<T> getter;
    Action<T> setter;

    public Ptr(Func<T> g, Action<T> s)
    {
        getter = g;
        setter = s;
    }

    public T Deref
    {
        get { return getter(); }
        set { setter(value); }
    }
}
private IDocumentSession _session = DocumentStore.OpenSession()

var ptr = new Ptr<IDocumentSession>(
                () => _session, 
                newValue => _session = newValue))

session.Deref.SaveChanges();
session.Deref = DocumentStore.OpenSession();