2012-06-04 18 views

cevap

3

Bu ikisini C# içinde tek bir işlevde birleştirmek mümkün değildir. C# ve CLR'deki void, sadece bir tür değildir ve dolayısıyla boş olmayan bir işleve göre farklı dönüş anlamlarına sahiptir. Böyle bir modeli düzgün bir şekilde uygulayabilmenin tek yolu, boşluk ve boş olmayan delegeler için bir aşırı yük sağlamaktır.

CLR sınırlaması, her CLR dilinde yapmanın imkansız olduğu anlamına gelmez. Hiçbir değer döndürmeyen bir işlevi temsil etmek için void'u kullanan dillerde yalnızca imkansızdır. Bu model, bir değer döndürmeyen yöntemler için void yerine Unit kullandığı için F # içinde çok yapılabilir.

+0

Teşekkür:

Bu Bulduğum en basit sözdizimi. – CaffGeek

4

Action yöntemini uygulamak için ikinci bir Func<T> sürümünüzü kullanarak Action uygulamasını bir lambdada paketleyerek kullanabilirsiniz. Bu, çoğaltılan kodların bir kısmını ortadan kaldırır.

söyleniyor
private static void TryCatch(Action action) 
{ 
    Func<object> fun => 
     { 
      action(); 
      return null; 
     }; 
    TryCatch(fun); 
} 

, bunu yaparken katılan ekstra havai Muhtemelen o uygulandığı şu anda sahip şekilde (özellikle orijinal versiyonu olmak olur ne kadar kısa ve basit verilmiş terk ediyorum, bu yüzden şahsen, orada bu durum).

+0

+1 Alternatif sözdizimi için cevabımı bakın. –

+0

Teşekkürler, önerildiği gibi olduğu gibi bırakacağım. Sucks Ben aslında tek bir fonksiyona indiremiyorum. – CaffGeek

+0

@Chad Hayır - bunu bir tek liner yapabilirdiniz - ikiye böldüm, böylece neler olduğunu anlayabiliyordunuz, ama yönteminiz yeterince kısa, onu olduğu gibi bırakacağım. Yine de, yöntem aşırı yüklenmesini ortadan kaldırmanın bir yolu yok. –

1

Bunu, @ReedCopsey önerileri olarak yapıyorum. bu mümkün değil neden açıklama

private static void TryCatch(Action action) 
{ 
    TryCatch(() => { action(); return 0; }); 
} 
+0

Bir parametreyi Func'ye iletmeniz gerekiyorsa bunu nasıl yaparsınız? – Nicknow

İlgili konular