2015-12-02 19 views
6

Error: The type arguments for method GraphMLExtensions.SerializeToGraphML<TVertex, TEdge, TGraph>(TGraph, XmlWriter) cannot be inferred from the usage.phương pháp mở rộng không hoạt động (Quick Graph serialization)

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

Mã này được sao chép từ tài liệu QuickGraph của. Tuy nhiên, khi tôi viết rõ ràng nó hoạt động:

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

Chỉnh sửa: Tôi thấy một số câu hỏi liên quan, nhưng chúng quá tiên tiến đối với tôi. Tôi chỉ quan tâm đến việc sử dụng nó. Tôi đang làm điều gì đó sai hay đó là tài liệu?

+0

Bạn có tất cả các cụm được tham chiếu và tất cả các thông tin cần thiết không? – BendEg

+0

Có. Như bạn có thể thấy từ mã thứ hai, lớp GraphMLExtensions được nhận ra. Đó là trong không gian tên QuickGraph.Serialization. – kptlronyttcna

+0

Điều gì xảy ra, nếu bạn thiết lập các loại chung? 'g.SerializeToGraphML <..., ...> (xwriter);'? – BendEg

Trả lời

5

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

Sự cố không phải với phương pháp tiện ích mở rộng. Các vấn đề đặt ra trong thực tế là khi bạn sử dụng đường dẫn phương thức tĩnh đầy đủ, bạn sẽ suppling các đối số kiểu chung loại một cách rõ ràng, trong khi sử dụng phương pháp mở rộng mà bạn không cung cấp bất kỳ.

Lỗi thực tế liên quan đến thực tế là trình biên dịch không thể suy ra tất cả các đối số kiểu chung cho bạn và cần sự trợ giúp của bạn bằng cách chuyển chúng một cách rõ ràng.

này sẽ làm việc:

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

Thật là đau đớn, cảm ơn. – kptlronyttcna

+0

@kptlronyttcna Bạn hoan nghênh. Có lẽ trình biên dịch có thể suy ra * một số * đối số kiểu cho bạn. Tôi không chắc chắn, hãy thử kết hợp chính mình. –

2

Các gợi ý lớn nhất ở đây là bạn đang gặp phải để được rõ ràng cho các tham số gõ vào GraphMLExtensions.SerializeToGraphML() cuộc gọi của bạn.

Tôi đã xem nhanh số source cho việc này và nhận ra điều gì đang xảy ra.

Bạn đang sử dụng quá tải này:

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

Đây TEdgeTGraph cần phải được thiết lập để loại cụ thể, nhưng không có lý lẽ phù hợp với các thông số loại. Điều này có nghĩa là bạn phải đặt chúng một cách rõ ràng.

2

Bạn cần chỉ định các loại chung, để sử dụng đúng phương pháp chung. Chỉ cần thêm chúng để gọi phương thức chung:

// Your using block, ... 
g.SerializeToGraphML<string, Edge<string>, AdjacencyGraph<string, Edge<string>>>(xwriter); 
Các vấn đề liên quan