2017-04-12 14 views
6

F # örneğin isteğe bağlı parametresi tarafından sadece farklı olmasına fonksiyonları aşırı sağlar?isteğe bağlı parametreleri ile f # aşırı fonksiyonları arasında ayrım

+1

: 'Sınıfım türünde() = üye this.func (a : string, b: string) = "func (a, b)" üye this.func (a: string,? c: string) = "func (a,? c)" let test = MyClass() let ARG1 = "2" = "12" test.func (ARG1, b = arg2) arg2 izin |> printfn "%" s // fonk (a, b) test.func (arg1, c = arg2) |> printfn "% s" // func (a,? c) ' –

cevap

8

İki aşırı yüklenme işlevi yalnızca isteğe bağlı bir parametre ile farklılık gösteriyorsa, ilk işlevi çağırmanın mantıklı bir yolu olduğunu sanmıyorum. Yorumlarda belirtildiği gibi, bunu kullanmak muhtemelen zayıf bir tasarımdır ve parametreleri yeniden adlandırmalısınız.

hata FS0041: yöntemle 'fonk' could için benzersiz aşırı Eğer MyClass().func("A","B") kullanarak sıradan bir şekilde işlevini çağırarak çalıştığınızda

muhtemelen fark gibi

, sen belirsizlik şikayet bir hata mesajı Bu program noktasından önce tip bilgisine göre belirlenemez. Bir tip açıklama gerekli olabilir. Adaylar: Üye MyClass.func: a: string * b:? Dize -> dize, üye MyClass.func: a: string * b: dize -> dize

iki şekilde açıkça ikinci aşırı çağırabilir açıkça isteğe bağlı argüman için Some değer sağlayabilir olması sayesinde (?b olan veya olmayan): meraktan

MyClass().func("A") 
MyClass().func("A",?b=Some "B") 

, bu statik üye kısıtlaması yoluyla ilk aşırı çağırabilir çıkıyor. Bu oldukça çirkin ve muhtemelen bu yapmamalısın, ama ilk aşırı çağırır:

let inline callFunc (o:^T) a b = 
    (^T : (member func : string * string -> string) (o, a, b)) 

callFunc (MyClass()) "A" "B" 
sadece herhangi işlevinde ikinci parametreyi yeniden adlandırabilirsiniz
İlgili konular