我有一个班级:
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的约束,这就是传入的变量格式化程序。
谁能告诉我这是什么问题?
答案 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);
}