Я написал код вроде
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 # и о том, как ее обойти?
Кстати: это может быть неправильный способ/паттерн, чтобы использовать интерфейс в любом случае, мне просто любопытно синтаксис языка