扩展方法不起作用(快速图形序列化)
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>
这里TEdge
和TGraph
需要设置具体的类型,但是没有匹配类型参数的参数。这意味着您必须明确设置它们。
您需要指定泛型类型,以便使用正确的泛型方法。只需添加它们以调用泛型方法:
// Your using block, ...
g.SerializeToGraphML<string, Edge<string>, AdjacencyGraph<string, Edge<string>>>(xwriter);
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>
这里TEdge
和TGraph
需要设置具体的类型,但是没有匹配类型参数的参数。这意味着您必须明确设置它们。
您需要指定泛型类型,以便使用正确的泛型方法。只需添加它们以调用泛型方法:
// Your using block, ...
g.SerializeToGraphML<string, Edge<string>, AdjacencyGraph<string, Edge<string>>>(xwriter);