2013-05-21 33 views
12

Ngày F # đầu tiên của tôi. Nếu tôi có điều này:F # tương đương với `is` từ khóa trong C#?

let cat = Animal() 

Bây giờ làm thế nào để tôi kiểm tra ở giai đoạn sau này nếu catisAnimal?

Trong C#

bool b = cat is Animal; 

Trong F #?

+9

'let b = cat:? Động vật' – ildjarn

+4

@ildjarn Bạn nên thêm câu trả lời đó thay vì nhận xét để có thể chấp nhận câu trả lời. –

+1

@Jack: Trên thiết bị di động để tôi không thể đưa ra câu trả lời kỹ lưỡng. Đừng ngại. : -] – ildjarn

Trả lời

21

@ildjarn xứng đáng tín dụng vào đây để trả lời đầu tiên, nhưng tôi gửi câu trả lời ở đây vì vậy nó có thể được chấp nhận.

Tương đương F # của từ khóa C# is:?. Ví dụ:

let cat = Animal() 
if cat :? Animal then 
    printfn "cat is an animal." 
else 
    printfn "cat is not an animal." 
8

Đối với cuộc biểu tình chỉ (không xác định một chức năng is):

let is<'T> (x: obj) = x :? 'T 

type Animal() = class end 
type Cat() = inherit Animal() 

let cat = Cat() 
cat |> is<Animal> //true 
+0

Daniel, bạn có thể cho tôi biết cái gì là '|>'? Tại sao nên bao gồm nó trước khi một cuộc gọi chức năng? Nó có tên không? – nawfal

+2

Nó được gọi là nhà điều hành đường ống phía trước. Nó áp dụng toán hạng ở bên trái làm đối số cuối cùng cho hàm ở bên phải. ([xem MSDN] (http://msdn.microsoft.com/en-us/library/ee340273.aspx)) – Daniel

+0

Daniel, tại sao bạn không định nghĩa là một hàm, trông khá hữu ích đối với tôi? – sacha

3

Tôi biết mình đã trễ. Nếu bạn cố gắng kiểm tra loại của một bộ sưu tập trong fsi với:? nó sẽ cung cấp cho một lỗi, nếu các loại mục không phù hợp. Ví dụ.

let squares = seq { for x in 1 .. 15 -> x * x } 
squares :? list<int> ;; // will give false 
squares :? list<string> ;; // error FS0193: Type constraint mismatch 

Gói trong một chức năng như Daniels là < 'T> hoạt động.

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