2017-01-05 19 views
6

Trong C#, các mã sau đây là hợp lệ:F # tương đương của Enum.TryParse

MyEnum myEnum = MyEnum.DEFAULT; 
if (Enum.TryParse<MyEnum>(string, out myEnum)) 
{ 
    Console.WriteLine("Success!"); 
} 

Vì vậy, tôi nghĩ tôi sẽ sử dụng này trong F #. Đây là nỗ lực của tôi:

let mutable myEnum = MyEnum.DEFAULT 
if Enum.TryParse<MyEnum>(string, &myEnum) then 
    printfn "Success!" 

Nhưng nó than phiền

a generic construct requires that the type 'MyEnum' have a default constructor

gì trên thế giới Điều đó có nghĩa là gì?

+1

Tôi không thể tạo lại điều này nếu tôi thay đổi 'MyEnum' cho' System.DayOfWeek'. Định nghĩa của 'MyEnum' là gì? FYI bạn có thể loại bỏ sự cần thiết cho 'mutable' bằng cách làm' let (ok, myEnum) = Enum.TryParse (chuỗi) 'thay thế. – Lee

+5

Enum của bạn được xác định như thế nào? Tôi nghĩ rằng bạn có thể đang cố gắng phân tích một công đoàn kỳ thị như enum thay thế. – scrwtp

+0

@scrwtp, bạn hoàn toàn đúng. Tôi đã không nhận ra có một sự khác biệt nhỏ trong cách nó được định nghĩa trong F #. Đã phải xem https://fsharpforfunandprofit.com/posts/enum-types/ để hiểu. Nếu bạn thực hiện câu trả lời này, tôi sẽ đặt câu trả lời là "câu trả lời". – user3685285

Trả lời

7

Đây là thông điệp khá hữu ích (nếu đúng về mặt kỹ thuật) mà trình biên dịch cung cấp cho bạn nếu bạn cố gắng phân tích giá trị công đoàn phân biệt bằng cách sử dụng Enum.TryParse.

Chính xác hơn, nếu bạn nhìn vào hàm đó, bạn sẽ thấy rằng nó được tham số hóa với kiểu bị ràng buộc là loại giá trị với hàm tạo mặc định. DU không đáp ứng được tiêu chuẩn này - đây là những gì mà trình biên dịch phàn nàn.

Khi xác định một enum trong F #, không giống như C#, bạn cần phải rõ ràng cho từng nhãn một giá trị:

type MyEnum = 
    | Default = 0 
    | Custom = 1 
    | Fancy = 2 

Bỏ qua các giá trị sẽ làm cho trình biên dịch giải thích kiểu như một sự kết hợp kỳ thị, mà là một rất con thú khác.

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