扩展方法不起作用(快速图形序列化)

Extension method doesn't work (Quick Graph Serialization)

Error: The type arguments for method GraphMLExtensions.SerializeToGraphML<TVertex, TEdge, TGraph>(TGraph, XmlWriter) cannot be inferred from the usage.

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

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

Am I doing something wrong or it's the documentation?

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

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

这会起作用:

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

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

为此我快速浏览了 source,然后意识到发生了什么。

您正在使用此重载:

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

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

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

// Your using block, ...
g.SerializeToGraphML<string, Edge<string>, AdjacencyGraph<string, Edge<string>>>(xwriter);