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
相关产品推荐
相关产品推荐

