小编Vla*_*lka的帖子

C#泛型方法类型参数不是从用法推断出来的

最近我尝试了访问者模式的实现,我尝试使用通用接口强制执行A​​ccept&Visit方法:

public interface IVisitable<out TVisitable> where TVisitable : IVisitable<TVisitable>
{
    TResult Accept<TResult>(IVisitor<TResult, TVisitable> visitor);
}
Run Code Online (Sandbox Code Playgroud)

- 其目的是1)将某些类型的"Foo"标记为可由这样的访问者访问,而访问者又是"这种类型Foo的访问者",2)在实现访问类型上强制执行正确签名的Accept方法,如此:

public class Foo : IVisitable<Foo>
{
    public TResult Accept<TResult>(IVisitor<TResult, Foo> visitor) => visitor.Visit(this);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,访客界面非常好:

public interface IVisitor<out TResult, in TVisitable> where TVisitable : IVisitable<TVisitable>
{
    TResult Visit(TVisitable visitable);
}
Run Code Online (Sandbox Code Playgroud)

- 1)标记访问者"能够访问"TVisitable 2)该TVisitable的结果类型(TResult)应该是3)强制执行访问方法每个TVisitable访问者实现"能够访问"的正确签名,像这样:

public class CountVisitor : IVisitor<int, Foo>
{
    public int Visit(Foo visitable) => 42;
}

public class NameVisitor : IVisitor<string, Foo>
{
    public string Visit(Foo visitable) => "Chewie";
}
Run Code Online (Sandbox Code Playgroud)

非常愉快和漂亮,这让我写道:

var …
Run Code Online (Sandbox Code Playgroud)

c# generics methods type-inference interface

24
推荐指数
3
解决办法
698
查看次数

标签 统计

c# ×1

generics ×1

interface ×1

methods ×1

type-inference ×1