C#具有内置代理Action<>
和Func<>
。是否可以为此代表使用'ref'类型参数?例如,此代码:
public delegate void DTest( ref Guid a );
public event DTest ETest;
将编译。但是,如果我使用Action<>
,它将无法编译:
public event Action< ref Guid > ETest;
任何提示?
答案 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引用,因此将保留数据。