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)
只要您的引用是复杂对象(具有属性),您就可以.
示例对象:
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引用,因此将保留数据.
也发布在我的博客上.