2015-12-02 6 views
6

Error: The type arguments for method GraphMLExtensions.SerializeToGraphML<TVertex, TEdge, TGraph>(TGraph, XmlWriter) cannot be inferred from the usage.метод расширения не работает (Quick Graph Сериализация)

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

Edit: Я видел некоторые родственные вопросы, но они слишком продвинутые для меня. Я просто беспокоюсь об использовании этого. Я что-то делаю неправильно или это документация?

+0

У вас есть все ссылки, ссылки и все необходимые сведения? – BendEg

+0

Да. Как видно из второго кода, распознается класс GraphMLExtensions. Он находится в пространстве имен QuickGraph.Serialization. – kptlronyttcna

+0

Что происходит, если вы задаете общие типы? 'g.SerializeToGraphML <..., ...> (xwriter);'? – BendEg

ответ

5

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

Какая боль, спасибо. – kptlronyttcna

+0

@kptlronyttcna Приветствую вас. Возможно, компилятор способен вывести * some * аргументов типа для вас. Я не уверен, какие, попробуйте комбинации сами. –

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> 

Здесь TEdge и TGraph должны быть установлены для конкретных типов, но нет никаких аргументов, которые соответствуют параметрам типа. Это означает, что вы должны явно установить их.

2

Необходимо указать общие типы, чтобы использовать правильный общий метод. Просто добавьте их для вызова общего метода:

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