是否可以在C#内置Action <>委托中使用ref类型?

gri*_*yvp 30 c#

C#有内置委托Action<>Func<>.是否可以为此代表使用'ref'类型参数?例如,这段代码:

public delegate void DTest( ref Guid a );
public event DTest ETest;
Run Code Online (Sandbox Code Playgroud)

会编译.但如果我使用Action<>,它将无法编译:

public event Action< ref Guid > ETest;
Run Code Online (Sandbox Code Playgroud)

任何提示?

Jon*_*eet 46

不,您不能使用代表传递引用Action.虽然Type在框架中存在"通过引用传递的类型"的概念,但就C#而言,它并不是正常意义上的类型.ref如果您看到我的意思,它是参数的修饰符,而不是类型名称的一部分.

但是,您可以构建自己的等效类型集,例如

delegate void ActionRef<T>(ref T item);
Run Code Online (Sandbox Code Playgroud)

当然,如果你想在同一个委托中混合使用ref和非ref参数,你会遇到一组可怕的组合:

delegate void ActionRef1<T1, T2>(ref T1 arg1, T2 arg2);
delegate void ActionRef2<T1, T2>(T1 arg1, ref T2 arg2);
delegate void ActionRef3<T1, T2>(ref T1 arg1, ref T2 arg2);
Run Code Online (Sandbox Code Playgroud)


Xca*_*r37 9

只要您的引用是复杂对象(具有属性),您就可以.

示例对象:

public class MyComplexObject
{
    /// <summary>
    /// Name provided for the result.
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Value of the result.
    /// </summary>
    public object Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

用于动作:

Action<MyComplexObject> myAction = (MyComplexObject result) =>
{
    result.Value = MyMethodThatReturnsSomething();                                              
};
Run Code Online (Sandbox Code Playgroud)

由于未更改MyComplexObject引用,因此将保留数据.

发布在我的博客上.