You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#委托能否包装类?类比C++ std::function的实现疑问

在C#中实现类似C++ std::function包装自定义类的效果

嘿,这个问题我之前也碰到过!C++的std::function对带operator()的自定义类(也就是functor)支持得特别顺畅,但C#的委托机制逻辑有点不一样,不过完全能实现你想要的效果,我给你拆解下:

首先得搞清楚报错的原因:你写new Foo(new Bar())的时候,编译器不知道该把Bar的哪个方法绑定到Foo委托上——C#的委托要求明确指定要绑定的方法,而不像C++的std::function会自动识别operator()。

下面是几种可行的解决方案:

1. 直接绑定到Bar的Invoke方法

这是最直接的方式,明确告诉委托要调用Bar实例的Invoke方法:

class Program {
    delegate void Foo();
    class Bar {
        public void Invoke() { }
    }
    static void Main() {
        Bar barInstance = new Bar();
        // 把Bar实例的Invoke方法绑定到委托
        Foo fooDelegate = new Foo(barInstance.Invoke);
        fooDelegate(); // 调用委托,会执行barInstance.Invoke()
    }
}

2. 使用内置委托+Lambda(更贴近C++的简洁感)

如果你不想自己定义委托类型,可以用C#内置的Action(对应无返回值、无参数的委托),配合Lambda表达式来包装,写法和C++的std::function更像:

using System;
class Program {
    class Bar {
        public void Invoke() { }
    }
    static void Main() {
        // 直接用Lambda包装Bar的调用
        Action myAction = () => new Bar().Invoke();
        myAction();

        // 如果需要复用同一个Bar实例,也可以这么写:
        Bar barInstance = new Bar();
        Action reusableAction = barInstance.Invoke; // 编译器会自动推断绑定方法
        reusableAction();
    }
}

3. 别尝试继承System.Delegate

你提到委托内部是继承自System.Delegate的,但这里要注意:自定义类不能直接继承System.Delegate——这个类是CLR专门用于实现委托机制的,用户自定义类型不允许继承它,所以这条路走不通。

总的来说,C#虽然没有C++那种自动识别operator()的特性,但通过明确绑定方法或者用Lambda包装,完全可以实现类似“把自定义类的行为包装成委托”的效果。

内容的提问来源于stack exchange,提问作者asynts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:47:34