Как реализовать интерфейс C # в F #? - PullRequest
7 голосов
/ 29 декабря 2010

Я хотел бы реализовать следующий интерфейс C # в F #:

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

Это то, что я пробовал, но оно дает мне: «Неполная структурированная конструкция в или до этой точки в выражении»

#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

Что я делаю не так?Может быть, отступ не так?

Ответы [ 2 ]

5 голосов
/ 29 декабря 2010

Я подтвердил ответ @ Марка в комментариях.Учитывая следующий код C #:

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

}

Следующая реализация F # (единственное изменение - добавление () при построении объекта) работает "отлично":

#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()

Хотя вы этого не делаетебольше не нужно использовать #light (это значение по умолчанию), и вы можете захотеть предупредить имя параметра NamespaceDictionary о том, что «идентификаторы переменных в верхнем регистре обычно не должны использоваться в шаблонах и могут указывать имя шаблона с ошибкой».Также обратите внимание, что вам нужно будет привести MyClass к ISparqlCommand, чтобы получить доступ к внедренным участникам (не вопрос, который вы задали, но легко запутаться, если вы пришли из C #): например, (MyClass() :> ISparqlCommand).Name

1 голос
/ 29 декабря 2010

Спасибо всем!Следующий код на самом деле работает:

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

Это также пример того, как использовать Mono.Addins с F #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...