2014-11-28 11 views
10

F # derleyicisi kullanıyorum, bu projede yaşayan bir yöntem bağımsız değişkenini kullandığım için bir proje başvurusu eklemem gerektiğini söyleyen bir hata verir. Ancak bu yöntem özeldir!F # derleyicisi proje başvurusu gerektirir, ancak yöntem özel

Aşağıdaki proje yapıya sahiptir:

Programı -> Kütüphane ->

alt kütüphane bu içeriyor alt kütüphanesinden:

namespace SubLibrary 

type Widget = { Value: int } 

Kütüphane içeriyor bu:

namespace Library 

open SubLibrary 

type Banana = 
    { Value: int } 

    member private x.TakeWidget (w: Widget) =() 

Programı bu içerir:

open Library 

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 

    let banana = { Value = 42 } 
    0 

bu hatayı alıyorum:

error FS0074: 
The type referenced through 'SubLibrary.Widget' is defined in an assembly that is not referenced. 
You must add a reference to assembly 'SubLibrary' 

Ama TakeWidget yöntem özel olduğunu!

Banana'u bir kayıt yerine bir sınıfa dönüştürmeyi denedim, ancak bu hiçbir fark yaratmadı.

open Library 

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 

    let banana = CBanana 42 
    0 

:

using SubLibrary; 

namespace CLibrary { 
    public class CBanana { 
     int m_value; 

     public CBanana(int value) { 
      m_value = value; 
     } 

     private void TakeWidget(Widget w) { 
     } 
    } 
} 

Sonra CBanana yerine Banana kullanmak Programı değiştirdi: Bir deneme olarak

, ben CLibrary denilen Kütüphane bir C# sürümünü yarattı Şimdi bir hata alamıyorum. Aslında, C# ile bu yöntemi kamuya açabilirim ve bir çağrıyı derlemeye çalışmadığım sürece hata olmaz.

Derleyici neden SubLibrary'ye bir başvuru eklediğimi ısrar ediyor? Tabii, sadece devam edip sessiz bir hayat için ne yapmam gerektiğini söylerim, ancak SubLibrary, Kitaplığı'un özel bir uygulama detayıdır, bu da Program Programına tabi tutulmamalıdır. - Eğer özel üye taşımak gerekir

type BananaClass (value:int) = 
    member private x.TakeWidget (w: Widget) =() 
    member x.Value = value 

Siz de bir kayıtla etrafında çalışabilirsiniz: yerine kaydın bir sınıf ile çalıştı

cevap

2

Aslında, bu hile (F # 3.1) yaptığı ve ayrı modüle bir tür büyütme olarak bulunmaktadır: bir Ext modülünü açana kadar

type Banana = { Value: int } 

module Ext = 
    type Banana with 
     member x.TakeWidget (w: Widget) =() 

Derleyici eksik bağımlılık şikayetçi olmaz.

Derleyicinin neden ilk etapta şikayette bulunduğuna dair iyi bir fikrim yok. Muhtemelen onun tuhaflarından biri. Üretilen IL'de ciddi bir şüphe bulamadım (F # derleyicisinin hem iç hem de iç üyelerini IL'de içsel olarak işaret ettiği şaşırtıcı bir gerçeği hariç) - bunun bir sonucu olmadığı ortaya çıktı.

+0

Ayrıca F # 3.1 (VS 2013) kullanıyorum. Eğer Banana bir sınıfsa, kurucuya bir çağrı derleyebilirsiniz, ancak public 'Value' özelliklerine erişmeye çalışırsanız, o zaman hatayı alırsınız. Benim durumumda, içsel olma yöntemine ihtiyacım var, çünkü yansıma kullanılarak keşfedilmesi gerekiyor, bu yüzden isteğe bağlı bir uzantı benim için iyi değil. Cevabın için teşekkürler. – bananasareyellow

+0

Şaşırtıcı olmayan bir şekilde, spec "kamuya açık olmayan tüm varlıkların CLI derlenmiş formu" dahili "dir. – kaefer

İlgili konular