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

C#具有内置委托ActionFunc 。 是否可以为此委托使用’ref’类型参数? 例如,这段代码:

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

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

 public event Action ETest; 

任何提示?

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

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

 delegate void ActionRef(ref T item); 

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

 delegate void ActionRef1(ref T1 arg1, T2 arg2); delegate void ActionRef2(T1 arg1, ref T2 arg2); delegate void ActionRef3(ref T1 arg1, ref T2 arg2); 

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

示例对象:

 public class MyComplexObject { ///  /// Name provided for the result. ///  public string Name { get; set; } ///  /// Value of the result. ///  public object Value { get; set; } } 

用于动作:

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

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

也发布在我的博客上 。