Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在C#内置操作中使用ref类型<&燃气轮机;代表?_C# - Fatal编程技术网

是否可以在C#内置操作中使用ref类型<&燃气轮机;代表?

是否可以在C#内置操作中使用ref类型<&燃气轮机;代表?,c#,C#,C#具有内置的委托Action和Func。是否可以为此委托使用“ref”类型参数?例如,此代码: public delegate void DTest( ref Guid a ); public event DTest ETest; 将编译。但是如果我使用操作,它将不会编译: public event Action< ref Guid > ETest; 公共事件操作ETest; 有任何提示吗?没有,您不能对操作委托使用按引用传递。虽然框架中有一个“通过引用传递的类型”的概念,即

C#具有内置的委托
Action
Func
。是否可以为此委托使用“ref”类型参数?例如,此代码:

public delegate void DTest( ref Guid a );
public event DTest ETest;
将编译。但是如果我使用
操作
,它将不会编译:

public event Action< ref Guid > ETest;
公共事件操作ETest;

有任何提示吗?

没有,您不能对
操作
委托使用按引用传递。虽然框架中有一个“通过引用传递的类型”的概念,即
类型
,但就C#而言,它并不是正常意义上的类型
ref
是参数的修饰符,不是类型名称的一部分,如果你明白我的意思的话

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

delegate void ActionRef<T>(ref T item);
委托无效操作参考(参考T项);
当然,如果您希望在同一个委托中混合使用ref和non-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);
委托无效操作REF1(ref T1 arg1,T2 arg2);
代表无效操作参考2(T1 arg1,参考T2 arg2);
代表无效行动参考3(参考T1 arg1,参考T2 arg2);

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

示例对象:

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; }
}
公共类MyComplexObject
{
/// 
///为结果提供的名称。
/// 
公共字符串名称{get;set;}
/// 
///结果的价值。
/// 
公共对象值{get;set;}
}
在动作中使用:

Action<MyComplexObject> myAction = (MyComplexObject result) =>
{
    result.Value = MyMethodThatReturnsSomething();                                              
};
Action myAction=(MyComplexObject结果)=>
{
result.Value=MyMethodThatReturnsMethoding();
};
由于MyComplexObject引用未更改,因此数据将保留


另外。

这是唯一用lamda语法定义的吗?ActionRef Setter2=(ref int x,int y)=>x=y;很好。。。但只比正常情况长一点。@sgtz:我想是的-这是一个非常不寻常的要求,所以如果没有太多的工作使其简洁,我并不感到惊讶。那么“ref R[I]”呢,其中R是一个列表。这可能吗?你想让我提出一个新问题吗?嗨,乔恩,在C#7这方面有什么变化吗?因为我(在一个C#6项目中)使用了Action,但R#说这是一个C#7特性时出错了。这是他们的错吗?@gdoron:我不知道。在C#7中有大量关于
ref
的新内容,但并非如此。。。