为什么这种方法在调用时通用参数失败?

时间:2011-01-30 21:30:34

标签: c# generics

我有一个班级:

public class Document<T> : IFormattable<string, Document<T>> where T : Info
{
    public Document(IList aList<T>) { ... }

    public string Format(IFormatter<string, Document<T>> formatter) { ... }
}

和另一个采用Document T的函数的函数:

public void Insert<T>(Document<T> document) where T : Info
{
    IFormatter<string, Document<ConcreteInfo>> formatter = new ConcreteFormatter();
    document.Format(formatter);
}
然而,编译器抱怨:

  

Document.Format(IFormatter&gt;)的最佳重载方法有一些无效的参数。

据我所知,Document的Format方法需要

IFormattable<string, Document<T>>

有一个Info on T的约束,这就是传入的变量格式化程序。

谁能告诉我这是什么问题?

2 个答案:

答案 0 :(得分:4)

调用document.Format时T的类型是什么?或者,文档的类型是什么?

如果它不是ConcreteInfo,那么你有一个问题:

Document<OtherInfo> document = new Document<OtherInfo>();
IFormatter<string, Document<ConcreteInfo>> formatter = new ConcreteFormatter();
document.Format(formatter);

格式需要IFormatter<string, Document<OtherInfo>>,但您传递的是IFormatter<string, Document<ConcreteInfo>>

答案 1 :(得分:2)

您的Insert方法会创建一个没有泛型类型参数的对象 - new ConcreteFormatter() - 所以当方法和document.Format调用期望类型为因T而异。

你需要这样的东西:

public void Insert<T>(Document<T> document) where T : Info
{
    IFormatter<string, Document<T>> formatter = new ConcreteFormatter<T>();
    document.Format(formatter);
}

更好的是:

public void Insert<T>(Document<T> document) where T : Info
{
    var formatter = new ConcreteFormatter<T>();
    document.Format(formatter);
}