2010-03-02 10 views
6

Mam następujący kod w rozszerzeniu typu (w F #), który wywołuje metodę chronioną klasy, z której dziedziczy (w języku C#) , ale otrzymuję wyjątek (zobacz poniżej). Czy istnieje obejście tego problemu?Jak uzyskać dostęp do chronionego elementu

let getPagereference id = 
    this.ConstructPageReference(id) 

Człon lub obiekt konstruktora 'ConstructPageReference' nie jest dostępny. Dostęp do prywatnych członków można uzyskać tylko z poziomu deklarowanego typu. Dostęp do chronionych członków można uzyskać tylko z typu rozszerzającego i nie można uzyskać do nich dostępu z wewnętrznych wyrażeń lambda.

Aktualizacja:

Próbowałem następujących ale otrzymuję ten sam rezultat

let getPagereference id = 
    base.ConstructPageReference(id) 

Update 2 (roztwór):

Oto kod, jak to było:

type MyNewType() = 
    inherit SomeAbstractType() 

    let getPagereference id = 
     base.ConstructPageReference(id) 

    override this.SomeMethod()= 
     let id = 0 
     let pr = getPagereference id 

to jak powinno być:

type MyNewType() = 
    inherit SomeAbstractType() 

    member this.ConstructPageReference(id) = 
     base.ConstructPageReference(id) 

    override this.SomeMethod()= 
     let id = 0 
     let pr = this.ConstructPageReference(id) 
+0

F # (i AFAIK dla wszystkich języków interfejsu CLI) wyróżnia modyfikatory dostępu: http://msdn.microsoft.com/en-us/library/ms173121.aspx –

+0

A może nie rozumiem pytania ... –

+0

to do f # interactive – Enes

Odpowiedz

6

Gabe jest poprawna. Twój kod:

let getPagereference id = 
    this.ConstructPageReference(id) 

jest taka sama jak

let getPagereference = fun id -> 
    this.ConstructPageReference(id) 

i dlatego są niejawnie próby wywołania metody bazowego od wewnątrz wyrażenia lambda. Będziesz musiał to zrobić od członka, a nie do funkcji zwalnianej.

6

Założę kluczowym elementem jest nie mogą być dostępne od wewnętrznej lambda wyrażenia. Prawdopodobnie próbujesz uzyskać dostęp z poziomu lambda.

Czy próbowałeś

member this.getPagereference(id) = 
    this.ConstructPageReference(id) 
+0

Niestety nie – Enes

Powiązane problemy