C#泛型对象双分派访问者模式重载匹配失效问题
关于泛型
TimedValue<T>双分派访问者模式的问题解答 - 特定类型重载无法触发的核心原因
C#的重载决议是编译时确定的,泛型类型TimedValue<T>的实例在编译阶段只会被识别为TimedValue<T>,访问者无法自动匹配到TimedValue<bool>或TimedValue<string>对应的重载——除非为每个需要特殊处理的T对应的TimedValue<T>显式实现Accept方法。 - 是否必须放弃泛型?
不用,但必须做针对性的显式实现:
比如给TimedValue<bool>单独实现Accept方法,直接调用访问者的VisitSpecific(TimedValue<bool>),TimedValue<string>同理。示例代码如下:
要是不愿做这些显式实现,那确实只能改成非泛型的特定类型(比如public class TimedValue<bool> : ITimedValue { public void Accept(ITimedValueVisitor visitor) { visitor.VisitSpecific(this); } }BoolTimedValue、StringTimedValue),否则访问者永远只会调用通用的VisitSpecific<T>(TimedValue<T>)重载。
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

