2011-09-08 28 views
6

Olası Çoğalt: Neden Main yılında görüşmesinde aşağıdaki kod örneği tipi argümanlar
C# 3.0 generic type inference - passing a delegate as a function parameterNeden bu tür bağımsız değişkenler çıkarılamıyor?

çıkarımda?

using System; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Method(Action); 
    } 

    static void Action(int arg) 
    { 
     // ... 
    } 

    static void Method<T>(Action<T> action) 
    { 
     // ... 
    } 
} 

Bu aşağıdaki hata iletisini sağlar:

hata CS0411: yöntem Program.Method<T>(System.Action<T>) tip argümanlar kullanım çıkarılabilir edilemez. Tip argümanlarını açıkça belirtmeyi deneyin.

+0

Çok teşekkür ederim. Aranıyor ama bulamadım. –

+0

@Pieter: Darin tarafından belirtilen mesajın cevabı var ve daha fazla bilgi için iyi bağlantıları var. –

+0

10 mesaj veya bir şey okudu, ancak yukarıdakilerin arasında değildi. –

cevap

0

Bunu koymak derleyicinin ne demek istediğini görüyorum.

Bunun nedeni, bir yöntem grubu olarak Action kullanılmasının nedeni, ancak Action<int> türünde olmamasıdır. Bu tip için döküm halinde

çalışır:

Method((Action<int>)Action); 
+5

Bunun int olmasını beklerdim. Ve sanırım OP zaten derleyicinin ona ne söylediğini biliyor. –

+0

Bir derleyiciye koyana kadar, sorunun içeriğini salıvermedim. Hemen açık değil, Eylem yöntemi ifade eder. – TheCodeKing

0

Bu çalışır:

static void Main(string[] args) 
    { 
     Method<int>(Action); 
    } 

    static void Action(int arg) 
    { 
     // ... 
    } 

    static void Method<T>(Action<T> action) 
    { 
     // ... 
    } 
+1

Evet, ama burada sorulan şey bu değil. Sorulan soru, OP ** 'nin gösterdiği şeyin neden çalışmadığıdır. –

2

sorun Action olmasıdır; aslında (bir kenara zaten bir tür olmaktan yeniden adlandırmak lütfen) , temsilci türü Action<int>'a dönüştürülebilen bir yöntem grubudur. Yöntem türü ifadeleri, yazım hatası olan olduğundan, tür-sonuçlandırma motoru türden çıkamaz. Yöntem grubunu gerçekten Action<int>'a atarsanız, yazım sonu değeri başarılı olur:

Method((Action<int>)Action); // Legal 
İlgili konular