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

时间:2009-11-10 11:31:23

标签: c#

C#具有内置代理Action<>Func<>。是否可以为此代表使用'ref'类型参数?例如,此代码:

public delegate void DTest( ref Guid a );
public event DTest ETest;

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

public event Action< ref Guid > ETest;

任何提示?

2 个答案:

答案 0 :(得分:39)

不,您不能对Action代表使用pass-by-reference。虽然在框架中存在“通过引用传递类型”作为Type的概念,但就C#而言,它并不是正常意义上的类型。如果您明白我的意思,ref是参数的修饰符,而不是类型名称的一部分。

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

delegate void ActionRef<T>(ref T item);

当然,如果你想在同一个委托中混合使用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);

答案 1 :(得分:8)

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

示例对象:

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

用于动作:

Action<MyComplexObject> myAction = (MyComplexObject result) =>
{
    result.Value = MyMethodThatReturnsSomething();                                              
};

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

posted on my blog