2013-08-22 113 views
5

EDIT: Thêm ví dụ hoàn chỉnh hơn, làm rõ vấn đề.Thuộc tính F #, typeof và "Đây không phải là biểu thức liên tục"

Một số thuộc tính .NET yêu cầu tham số loại Type. Làm thế nào để khai báo các tham số này trong F #?

Ví dụ, trong C# chúng ta có thể làm điều này:

[XmlInclude(typeof(Car))] 
[XmlInclude(typeof(Truck))] 
class Vehicle { } 
class Car : Vehicle { } 
class Truck : Vehicle { } 

Nhưng, trong F # sau ...

[<XmlInclude(typeof<Car>)>] 
[<XmlInclude(typeof<Truck>)>] 
type Vehicle() = class end 
type Car() = inherit Vehicle() 
type Truck() = inherit Car() 

... kết quả trong một lỗi biên dịch: Đây không phải là một biểu thức liên tục hoặc giá trị thuộc tính tùy chỉnh hợp lệ.

Trả lời

5

Bạn nên giải quyết phụ thuộc loại hình tròn được giới thiệu bằng cách sử dụng chuyển tiếp của các loại trong thuộc tính. Đoạn mã dưới đây cho biết cách thực hiện điều này trong F #:

// Compiles OK 
[<AttributeUsage(AttributeTargets.All, AllowMultiple=true)>] 
type XmlInclude(t:System.Type) = 
    inherit System.Attribute() 

[<XmlInclude(typeof<Car>)>] 
[<XmlInclude(typeof<Truck>)>] 
type Vehicle() = class end 
and Car() = inherit Vehicle() 
and Truck() = inherit Car() 
2

Bạn có thể thử đặt cùng một ví dụ hoàn chỉnh hơn cho lỗi không? Tôi chỉ nhanh chóng cố gắng một cái gì đó tương tự và nó hoạt động tốt (trong F # 3.0 trong Visual Studio 2012):

type Car = C 

type XmlInclude(typ:System.Type) = 
    inherit System.Attribute() 

[<XmlInclude(typeof<Car>)>] 
let foo = 0 

Tôi đoán có một số chi tiết nhỏ ở đâu đó gây bối rối cho các F # biên dịch đối với một số lý do - nhưng nó nên hiểu typeof (đó là, trong thực tế, một chức năng) và cho phép sử dụng nó trong các thuộc tính.

+0

Cảm ơn bạn đã xác nhận rằng * * này nên hoạt động. Khi tôi cố gắng kết hợp một ví dụ thử nghiệm cho bạn, tôi thấy vấn đề không phải là sử dụng ** typeof <...> ** trong một thuộc tính. Vấn đề là các lớp ** Xe ** và ** Xe tải ** được xác định * sau * lớp cơ sở. – Wally

+1

@Wally Trong trường hợp đó, bạn có thể cần 'loại ... và ...' để xác định các loại đệ quy (nhìn thấy nhau). –

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