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

时间:2015-12-02 07:44:43

标签: c# .net quickgraph

  

错误:方法的类型参数   无法从使用情况中推断出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);

编辑:我看到了一些相关问题,但对我来说太过先进了。我只是担心使用它。我做错了什么还是文件?

3 个答案:

答案 0 :(得分:5)

  

我做错了什么或是文档?

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

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

这将有效:

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

答案 1 :(得分:2)

此处最大的提示是,您必须明确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需要设置为特定类型,但没有与类型参数匹配的参数。这意味着您必须明确设置它们。

答案 2 :(得分:2)

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

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