Подтвердить что ты не робот

При ошибке компиляции доступности, когда публичный тип реализует внутренний интерфейс в F #

Я написал код вроде

type internal IMyInterface =
    abstract member Method1 : unit -> unit

type Class1() = 

    member this.Y() =
        (this :> IMyInterface).Method1()

    interface IMyInterface with
        member this.Method1() = ()

Обратите внимание, что открытый тип Class1 реализует внутренний интерфейс IMyInterface, он компилируется отлично. В сгенерированном MSIL "Method1" был показан как закрытый. Это похоже на явные интерфейсы в С#.

Однако, когда я немного меняю код на

type internal Foo() =
    member x.Value = "Foo"

type internal IMyInterface =
    abstract member Method1 : Foo -> unit

type Class1() = 

    member this.Y() =
        let v = Foo()
        (this :> IMyInterface).Method1(v)

    interface IMyInterface with
        member this.Method1(v : Foo) = ()

Этот тип метода интерфейса "Метод1" принимает в качестве параметра внутренний тип "Foo". На этот раз он не компилируется с ошибкой

The type 'Foo' is less accessible than the value, member or type 'override Class1.Method1 : v:Foo -> unit' it is used in

У меня есть проблема с расшифровкой этого сообщения об ошибке и найти исправление для него. В С# я могу написать следующий код, который компилирует fine

internal class Foo
{
    string Value { get; set; }
}

internal interface IMyInterface
{
    void Method1(Foo v);
}

public class Class1 : IMyInterface
{
    public void Y()
    {
        var v = new Foo();
        (this as IMyInterface).Method1(v);
    }

    void IMyInterface.Method1(Foo v)
    {
        throw new NotImplementedException();
    }
}

Любая идея о ошибке компилятора F # и о том, как ее обойти?

Кстати: это может быть неправильный способ/паттерн, чтобы использовать интерфейс в любом случае, мне просто любопытно синтаксис языка

4b9b3361

Ответ 1

Как было отмечено в комментарии Патрика, эта проблема была зарегистрирована как ошибка Visual F #. В настоящее время он включен в веху F # 4.0 Update 3.