2014-07-15 7 views
6

Załóżmy, że istnieje klasa z jednym publicznym konstruktorem, który przyjmuje jeden parametr. Ponadto istnieje wiele publicznych właściwości, które chciałbym ustawić. Jaka byłaby składnia tego w F #? Na przykład w języku C#W języku F #, jaka jest składnia inicjatora obiektu z obowiązkowym parametrem konstruktora?

public class SomeClass 
{ 
    public string SomeProperty { get; set; } 

    public SomeClass(string s) 
    { } 
} 

//And associated usage. 
var sc = new SomeClass("") { SomeProperty = "" }; 

F # I może się to zrobić przy użyciu konstruktora lub property setters, ale nie oba jednocześnie, jak w języku C#. Na przykład poniższe są niepoprawne

Wygląda na to, że czegoś brakuje, ale co?

< edit: Jak podkreślił David, robi to wszystko w F # prac, ale z jakiegoś powodu, przynajmniej dla mnie :), to robi się trudne, gdy klasa do stosowania w F # jest zdefiniowany w DO#. Przykładem takiego jest TopicDescription (aby stworzyć coś na tyle publicznego, jak na przykład). Można napisać, na przykład

let t = new TopicDescription("", IsReadOnly = true) 

i odpowiedni błąd kompilator będzie Method 'set_IsReadOnly' is not accessible from this code location.

Odpowiedz

6

Problem masz, że IsReadOnly posiada wewnętrzną setter.

member IsReadOnly : bool with get, internal set 

Jeśli chcesz go ustawić bezpośrednio będziesz potrzebować do podklasy TopicDescription.

Składnia konstruktora, na którą patrzysz, jest całkowicie akceptowalna.

let test = new Microsoft.ServiceBus.Messaging.TopicDescription("", EnableBatchedOperations=true) 

kompiluje się dobrze dla mnie.

+1

Masz rację. Tym, co doprowadziło mnie do zdumienia, jest to, że mój VS nie dodał squiggles kiedy próbowałem w C# '' var td = new TopicDescription ("") {IsReadOnly = true}; ''. Tak więc, właśnie założyłem, że w tym przypadku skompilowałoby się '' TopicDescription'' i kilka innych inicjalizacji klasy C#. Jak głupio byłem! – Veksi

6

Nigdy w programie F #, ale to wydaje się działać dobrze dla mnie:

type SomeClass(s : string) = 
    let mutable _someProperty = "" 
    let mutable _otherProperty = s 
    member this.SomeProperty with get() = _someProperty and set(value) = _someProperty <- value 
    member this.OtherProperty with get() = _otherProperty and set(value) = _otherProperty <- value 

let s = new SomeClass("asdf", SomeProperty = "test"); 

printf "%s and %s" s.OtherProperty s.SomeProperty; 

która wyprowadza "asdf and test".


Ponadto następujący kod działa dobrze dla mnie:

public class SomeClass 
{ 
    public string SomeProperty { get; set; } 
    public string OtherProperty { get; set; } 

    public SomeClass(string s) 
    { 
     this.OtherProperty = s; 
    } 
} 

Następnie w F #:

let s = SomeClass("asdf", SomeProperty = "test") 
+0

To prawda, ale w tym przypadku '' SomeClass'' jest klasą C#, której potrzebuję użyć (np. [TopicDescription] (http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging .topicdescription.aspx)) jest taki. Dziękuję za umieszczenie tego tutaj, ale widzę, że muszę wyjaśnić moje pytanie. – Veksi

Powiązane problemy