olarak boş yok:Tür uygun bir değere örnek program için
type public MyClass(reasonForLiving:string) =
member x.ReasonForLiving with get() = reasonForLiving
let classFactory() = MyClass("up to you")
let live() =
let instance = classFactory()
if instance = null then raise(System.Exception("null is not living... that's why OO languages die from bugs"))
instance
hatası alıyorum "türü 'Sınıfım' uygun bir değer olarak boş yok" Ben bu sınıfı kullanmak gitmek örtük olarak yazılan işlevlerin bir dönüş değeri olarak ve numaralı ile karşılaştır (C# bağımlılık enjeksiyonuyla uyumluluk gereksinimlerinin b/c'si F # seçenek türlerine güvenemiyorum).
Kolayca için boş çek değiştirerek bunu düzeltebilirsiniz:
if instance :> obj = null then
Ancak, bu tamamen "yanlış" olduğunu ("hissetmek") biliyorum. Özellikle de, MyClass'ın kutulu olması gerekmeyen bir referans türü olduğunu düşündüğüm zaman (C# arka planından bahsediyorum).
"F # Değer Kısıtlaması" nı ve bunun tür çıkarımını nasıl etkilediğini okudum, ancak bu senaryo için nasıl geçerli olduğunu göz ardı edemiyorum.
S: Bunu yapmanın başka bir yolu var mı?
Kenara # 1: Sınıfım bir olduğunu ... düşünmeden System.Nullable çalıştım: hatası almanın daha basit bir yöntem ... Kenara # 2
type public MyClass(reasonForLiving:string) =
member x.ReasonForLiving with get() = reasonForLiving
let nullMyClass : MyClass = null
bulundu Referans türü ve değil Nullable < _> gerektiren bir değer türü (struct). Öyleyse, bana sadece bir referans tipi ile uğraştığımı ve bana bir nesnenin neden bu işi yaptığını merak etmeme yol açtığını söyler.
Güncelleme: İlgilenen herkes için, aşağıdaki üç işlevle Ortak Hizmet Bulucu için tek bir çözüm olarak kullandım.
let private getServiceLocator() =
try Some(Microsoft.Practices.ServiceLocation.ServiceLocator.Current)
with | _ -> None
let private getService serviceFactory =
let serviceLocator = getServiceLocator()
let service = match serviceLocator with
| None -> serviceFactory()
| _ ->
match serviceLocator.Value.GetInstance<'a>() with
| null -> serviceFactory()
| svc -> svc
match service with
| null -> None
| _ -> Some(service)
let private getRequiredService serviceFactory =
let service = getService serviceFactory
match service with
| None -> raise(MissingServiceException(""))
| _ -> service.Value
Doh! Bunu gördükten sonra, MSDN "Boş Değerler (F #)" üzerindeki üçüncü cümleden tanıdım: http://msdn.microsoft.com/en-us/library/dd233197(v=vs.110).aspx –
Sadece add - –
John'u kullanmazsanız, 'Option' t 'kullanmak daha idiomatiktir - Evet, Option'u kullanamadığmdan bahsetmiştim. Bu yüzden, C# 'ye maruz kalan her sınıfın bir [# AllowNullLiteral>]' a ihtiyaç duyması C# dev olarak çalışacak ... :( –