【问题标题】:Func delegate with ref variable带有 ref 变量的函数委托
【发布时间】:2010-03-17 14:04:52
【问题描述】:
public object MethodName(ref float y)
{
//method
}

如何为这个方法定义一个 Func 委托?

【问题讨论】:

    标签: c# c#-3.0 reference delegates func


    【解决方案1】:

    Func 无法做到这一点,但您可以为它定义一个自定义的delegate

    public delegate object MethodNameDelegate(ref float y);
    

    使用示例:

    public object MethodWithRefFloat(ref float y)
    {
        return null;
    }
    
    public void MethodCallThroughDelegate()
    {
        MethodNameDelegate myDelegate = MethodWithRefFloat;
    
        float y = 0;
        myDelegate(ref y);
    }
    

    【讨论】:

    • 原因是:所有泛型类型参数必须是可转换为对象的东西。 “ref float”不能转换为对象,因此不能将其用作泛型类型参数。
    • 谢谢,我一直在努力使用 Func,所以我知道为什么当类型不能转换为对象时我不能使用它
    • 这是否意味着在这种情况下,委托输入需要装箱/拆箱?
    【解决方案2】:

    在 .NET 4+ 中,您还可以通过这种方式支持 ref 类型...

    public delegate bool MyFuncExtension<in string, MyRefType, out Boolean>(string input, ref MyRefType refType);
    

    【讨论】:

    • 不要复活死线程,但任何遇到这种情况的人都应该注意,虽然您可以通过这种方式支持带有泛型的 ref 参数,但泛型类型参数将是不变的。泛型类型参数不支持 c# 中 ref 或 out 参数的方差(协方差或逆变)。如果您不需要担心隐式类型转换,那还是可以的。
    • 对不起,这个答案有点偏离轨道。 inout 您正在展示的用于参数化代表的代表与共同与“逆变”有关,并且与 OP 所询问的内容无关。问题是关于可以通过引用接受参数的委托,而不是(通用)委托在其类型参数化方面的敏捷性。
    猜你喜欢
    • 2010-12-25
    • 2010-09-14
    • 2016-08-07
    • 1970-01-01
    • 2017-06-12
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多