2010-12-29 35 views
5

Ben F # Aşağıdaki C# arabirimini uygulamak istiyoruz:F # C# arabirimi nasıl uygulanır?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Mono.Addins; 

[TypeExtensionPoint] 
public interface ISparqlCommand 
{ 
    string Name { get; } 
    object Run(Dictionary<string, string> NamespacesDictionary, org.openrdf.repository.Repository repository, params object[] argsRest); 
} 

Bu ne denedim, ama bana verir: "Eksik yapılı yapısını veya ifadede bu noktada daha önce"

#light 

module Module1 

open System 
open System.Collections.Generic; 

type MyClass() = 
    interface ISparqlCommand with 
     member this.Name = 
      "Finding the path between two tops in the Graph" 
     member this.Run(NamespacesDictionary, repository, argsRest) = 
      new System.Object 

Neyi yanlış yapıyorum? Belki girinti yanlış?

+6

Belki sadece eksik parens Mono.Addins nasıl kullanılacağına bir örnektir? –

+1

C# arabirimi nedir? C# 'da bir CLR arayüzü tanımladınız. –

cevap

3

@ Mark'ın yorumlarda yanıtını doğruladım.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace org.openrdf.repository { 
    public class Repository { 
    } 
} 

namespace CSLib 
{ 

    [System.AttributeUsage(System.AttributeTargets.Interface)] 
    public class TypeExtensionPoint : System.Attribute 
    { 
     public TypeExtensionPoint() 
     { 
     } 
    } 


    [TypeExtensionPoint] 
    public interface ISparqlCommand 
    { 
     string Name { get; } 
     object Run(Dictionary<string, string> NamespacesDictionary, org.openrdf.repository.Repository repository, params object[] argsRest); 
    } 

} 

(tek değişiklik nesne inşaatında () ekliyor) Aşağıdaki F # uygulaması "iyi" çalışır: Aşağıdaki C# kodu Verilen

#light 

module Module1 

open System 
open System.Collections.Generic; 
open CSLib 

type MyClass() = 
    interface ISparqlCommand with 
     member this.Name = 
      "Finding the path between two tops in the Graph" 
     member this.Run(NamespacesDictionary, repository, argsRest) = 
      new System.Object() 

artık #light kullanmak gerekmez rağmen (varsayılan değerdir) ve NamespaceDictionary paramater adının başına "Büyük harfli değişken tanımlayıcılarının genellikle desenlerde kullanılmaması gerektiğini ve hatalı bir desen adı gösterebileceğini" uyarmak isteyebilirsiniz. Ayrıca (C# gelen karıştı almak için sormadınız bir soru ama kolay) uygulanan üyeleri erişmek için ISparqlCommand için MyClass döküm gerekecektir unutmayın: herkese örneğin (MyClass() :> ISparqlCommand).Name

1

Teşekkür! Aşağıdaki kod aslında çalışır:

namespace MyNamespace 

open System 
open System.Collections.Generic; 
open Mono.Addins 

[<assembly:Addin>] 
    do() 
[<assembly:AddinDependency("TextEditor", "1.0")>] 
    do() 

[<Extension>] 
type MyClass() = 
    interface ISparqlCommand with 
     member this.Name 
      with get() = 
       "Finding the path between two tops in a Graph" 
     member this.Run(NamespacesDictionary, repository, argsRest) = 
      new System.Object() 

Ayrıca `yeni System.Object'ten()` F # ile