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

C#中定义自返回方法的实现疑问及委托相关问题

回答

报错原因

你的Append方法返回的是Func<int, Delegate>类型:

  • 第一次调用Append("first","red")得到该委托;
  • 第二次调用时,C#会做隐式类型兼容(把字符串参数当成object适配int参数的位置,属于编译器的容错处理),调用后返回的是Delegate类型——这是所有委托的基类,但它本身不是可直接调用的具体委托类型,所以第三次调用时编译器无法识别它是可执行的委托,就会抛出"需要方法名"的错误。

实现目标链式调用的方案

要实现这种连续调用的语法,核心是让每次调用都返回强类型、可继续调用的委托/可执行对象,以下是两种可行方案:

方案1:自定义递归委托类型

C#支持自定义委托,我们可以直接定义递归委托来满足需求:

// 递归委托:接受两个string参数,返回自身类型的委托
public delegate MyAppendDelegate MyAppendDelegate(string text, string color);

public class Demo
{
    public static MyAppendDelegate Append(string text, string color)
    {
        Console.WriteLine($"{text}:{color}");
        // 返回当前方法的委托引用,支持链式调用
        return Append;
    }
}

调用示例:

Demo.Append("Title","red")(" - more txt", "black")("end","green");

这种方式完全是强类型实现,每次调用返回的都是MyAppendDelegate,可以无限链式调用。

方案2:接口+隐式转换(支持扩展)

如果需要后续扩展更多功能(比如存储调用记录),可以用接口配合隐式转换实现:

public interface IAppendable
{
    IAppendable Invoke(string text, string color);
}

public class AppendHandler : IAppendable
{
    // 存储所有调用的文本和颜色(可选扩展)
    public List<(string Text, string Color)> Records { get; } = new();

    public IAppendable Invoke(string text, string color)
    {
        Console.WriteLine($"{text}:{color}");
        Records.Add((text, color));
        return this;
    }

    // 隐式转换:让实例可以被当作委托调用
    public static implicit operator Func<string, string, IAppendable>(AppendHandler handler)
    {
        return handler.Invoke;
    }
}

// 对外暴露的入口方法
public static Func<string, string, IAppendable> Append(string text, string color)
{
    var handler = new AppendHandler();
    handler.Invoke(text, color);
    return handler;
}

调用方式完全符合需求:

Append("Title","red")(" - more txt", "black")("end","green");

这种方案的优势在于可以在AppendHandler中添加额外状态或方法,扩展性更强。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:30:34