使用generics-where-clause调用非泛型调用有什么好处?

Pie*_*ant 6 c# generics

我见过一些例子,他们改变了一个叫做的话

void Add(IDrawing item);
Run Code Online (Sandbox Code Playgroud)

void Add<TDrawing>(TDrawing item) where TDrawing : IDrawing;
Run Code Online (Sandbox Code Playgroud)

除了在调用函数时欺骗intellisense显示类的名称而不是接口名称,由于C#4中的推断类型用法,使用第二种方法还有其他优势吗?

要回答Jon Skeet,程序员使用的代码是:

public ObservableCollection<IDrawing> Items { get; private set; }

public void Add<TDrawing>(TDrawing item) where TDrawing : IDrawing
{
   this.Items.Add(item);
}
Run Code Online (Sandbox Code Playgroud)

我没有看到使用泛型而不是仅仅使用该IDrawing类型的参数的任何优势.我认为必须有一些非常合适的案例.我很想知道我是否遗漏了什么.

Jon*_*eet 5

这实际上取决于实施中其他地方的情况.这是一个不同的例子:

void Add<TDrawing>(TDrawing item, IList<TDrawing> list)
    where TDrawing : IDrawing
{
    if (item.SomePropertyOfIDrawing)
    {
        list.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,你不会想采取IList<IDrawing>在这里-因为你不能使用它,如果你有一个List<Painting>例如...,而上面的通用版本,这是绝对的罚款TDrawingPainting:约束确保财产可供的if条件,而事实上,它是通用的可以让你的项目安全添加到列表中.

如果你有完整的例子,你认为没有好处,那么值得特别提出.

编辑:不,在现在给出的确切示例中,将其作为通用方法没有任何优势.