2014-07-15 25 views
6

Giả sử có một lớp với một hàm tạo công khai, có một tham số. Ngoài ra, cũng có nhiều thuộc tính công khai mà tôi muốn đặt. Cú pháp cho điều đó trong F # sẽ là gì? Ví dụ trong C#Trong F #, cú pháp khởi tạo đối tượng với tham số hàm khởi tạo là gì?

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

    public SomeClass(string s) 
    { } 
} 

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

Trong F # tôi có thể thực hiện điều này bằng cách sử dụng các nhà xây dựng hoặc property setters, nhưng không phải cả hai cùng một lúc như trong C#. Ví dụ: thông tin sau đây không hợp lệ

let sc1 = new SomeClass("", SomeProperty = "") 
let sc2 = new SomeClass(s = "", SomeProperty = "") 
let sc3 = new SomeClass("")(SomeProperty = "") 

Có vẻ như tôi đang thiếu thứ gì đó, nhưng sao?

< chỉnh sửa: Như đã chỉ ra bởi David, làm tất cả trong F # công trình, nhưng đối với một số lý do, ít nhất là đối với tôi :), nó được khó khăn khi lớp được sử dụng trong F # được định nghĩa trong C#. Đối với một ví dụ về điều này là TopicDescription (để tạo thành một cái gì đó đủ công cộng như cho một ví dụ thêm). Người ta có thể viết, ví dụ

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

và lỗi trình biên dịch tương ứng sẽ là Method 'set_IsReadOnly' is not accessible from this code location.

Trả lời

6

Vấn đề bạn đang gặp phải là IsReadOnly có một setter nội bộ.

member IsReadOnly : bool with get, internal set 

Nếu bạn muốn cài đặt nó trực tiếp bạn sẽ cần phải phân lớp TopicDescription.

Cú pháp hàm tạo mà bạn đang xem là hoàn toàn có thể chấp nhận được.

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

chỉ biên dịch cho tôi.

+1

Bạn nói đúng. Điều gì đã dẫn tôi astry là VS của tôi đã không thêm squiggles khi tôi đã cố gắng trong C# '' var td = new TopicDescription ("") {IsReadOnly = true}; ''. Vì vậy, tôi chỉ giả định rằng trong trường hợp này '' TopicDescription'' và một loạt các khởi tạo lớp C# khác sẽ biên dịch. Tôi thật ngốc nghếch! – Veksi

6

tôi không bao giờ chương trình trong F #, nhưng điều này dường như làm việc tốt cho tôi:

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; 

Đó kết quả đầu ra "asdf and test".


Bên cạnh đó, các mã sau đây hoạt động tốt đối với tôi:

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

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

Sau đó, trong F #:

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

Có, nhưng trong trường hợp này '' SomeClass'' là lớp C# tôi cần sử dụng (ví dụ: [TopicDescription] (http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging .topicdescription.aspx)) là như vậy. Cảm ơn bạn đã đặt điều này ở đây, tuy nhiên, tôi thấy tôi cần làm rõ câu hỏi của mình. – Veksi

Các vấn đề liên quan