tür olarak geçersizdir . Neden "geçersiz" bir tür? Hiçbir örneği yoktur, değeri yoktur, genel tür argümanı, resmi parametre türü, yerel tür, alan türü veya özellik türü olarak kullanamazsınız. Bir tür olarak hiçbir anlamı yoktur; daha ziyade, bir yöntem çağrısının sanal makine yığını üzerinde ne gibi bir etkisi olduğu bir gerçektir . Ancak sanal makine sadece budur: sanal bir makine. Gerçek makine döndürülen değeri bir kayıt defterine koyar (genellikle x86'da EAX) ve yığını hiç etkilemez! Bir tür olarak geçersizlik sadece kötü bir fikirdir.
Daha kötüsü: bir işaretçi türünde kullanıldığında, dönüş türü olarak kullanıldığından tamamen farklı birvoid*
şey ifade eder. Şimdi "bilinmeyen tipte bir depolama yerine bir işaretçi" anlamına gelir. Bu, "herhangi bir değer döndürmeyen bir yöntem" anlamıyla hiçbir ilgisi yoktur.
void*
İşaretçi türü olarak değiştirebilirsiniz IntPtr
. (Ve void**
ile IntPtr*
vb.) Biz, "Unit", tek bir değer, yani null adlı olan bir tür olan bir dönüş türü olarak void yerini alabilir. CLR'nin bir uygulaması daha sonra, bir birim tipi işlev çağrısının "döndürülen" null değerinin güvenli bir şekilde göz ardı edilebileceğini bilerek kayıt veya yığın kullanımını uygun şekilde optimize edebileceğine karar verebilir.
Böyle bir dünyada artık ayrı Func<A, R>
ve Action<T>
delegelere ihtiyacınız yok . Action<T>
sadece Func<T, Unit>
.