6

GraphMLExtensions.SerializeToGraphML<TVertex, TEdge, TGraph>(TGraph, XmlWriter)错误:无法从用法中推断方法的类型参数 。

using System.Xml;
using QuickGraph;
using QuickGraph.Serialization;    

var g = new AdjacencyGraph<string, Edge<string>>();

.... add some vertices and edges ....

using (var xwriter = XmlWriter.Create("somefile.xml"))
  g.SerializeToGraphML(xwriter);

该代码是从 QuickGraph 的文档中复制的。但是,当我明确编写它时,它可以工作:

using (var xwriter = XmlWriter.Create("somefile.xml"))
   GraphMLExtensions.SerializeToGraphML<string, Edge<string>, AdjacencyGraph<string, Edge<string>>>(g, xwriter);

编辑:我看到了一些相关的问题,但它们对我来说太高级了。我只是担心使用它。我做错了什么还是文档?

4

3 回答 3

5

我做错了什么还是文档?

问题不在于扩展方法。问题在于,当您使用完整的静态方法路径时,您显式地提供了泛型类型参数,而使用扩展方法时您根本没有提供任何参数。

实际错误与编译器无法为您推断所有泛型类型参数这一事实有关,并且需要您通过显式传递它们来提供帮助。

这将起作用:

using (var xwriter = XmlWriter.Create("somefile.xml"))
{
    g.SerializeToGraphML<string, Edge<string>, 
         AdjacencyGraph<string, Edge<string>>>(xwriter);
}
于 2015-12-02T08:02:08.417 回答
2

这里最大的提示是您必须明确GraphMLExtensions.SerializeToGraphML()调用中的类型参数。

我快速查看了这个的来源,并意识到发生了什么。

您正在使用此重载:

public static void SerializeToGraphML<TVertex, TEdge, TGraph>(
    this TGraph graph,
         XmlWriter writer)
         where TEdge : IEdge<TVertex>
         where TGraph : IEdgeListGraph<TVertex, TEdge>

这里TEdgeTGraph需要设置为特定类型,但没有与类型参数匹配的参数。这意味着您必须明确设置它们。

于 2015-12-02T08:04:39.690 回答
2

您需要指定泛型类型,以便使用正确的泛型方法。只需添加它们以调用通用方法:

// Your using block, ...
g.SerializeToGraphML<string, Edge<string>, AdjacencyGraph<string, Edge<string>>>(xwriter);
于 2015-12-02T08:05:31.877 回答