2011-01-30 77 views
0

我有一个类:为什么这种调用通用参数失败的方法?

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

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

和在另一个类中一个函数,一个文档T:

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

然而,编译器与抱怨:

的最好重载方法Document.Format(IFormatter>)有一些无效的参数。

至于我可以看到文档的格式方法采用

IFormattable<string, Document<T>> 

与信息对T的约束,那就是在传递的变量格式是什么。

谁能告诉我问题是什么?

+0

很难确切地告诉你不知道更多你的类型层次的,但它听起来像是你有一个变化的问题。你可以从这里开始阅读这篇文章:http://msdn.microsoft.com/en-us/library/ee207183.aspx(这里有更多文章链接)。 – porges 2011-01-30 21:48:17

回答

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); 
} 
+0

但是当然ConcreteFormatter实现了IFormatter > ... – 2011-01-30 22:39:39

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>>