2010-10-10 28 views
13
class CustomClass<T> where T: bool 
{ 
    public CustomClass(T defaultValue) 
    { 
     init(defaultValue); // why can't the compiler just use void init(bool) here? 
    } 
    public void init(bool defaultValue) 
    { 

    } 
    // public void init(int defaultValue) will be implemented later 
} 

Hello. Bu basit bir soru gibi görünüyor, ancak internette bir cevap bulamadım: Derleyici neden init yöntemini kullanmıyor? Farklı tipler için farklı yöntemler sunmak istiyorum.C#: Genel yöntemle genel olmayan bir yöntemden arama yapın

Bunun yerine aşağıdaki hata iletisini yazdırır:

Ben bir ipucu hakkında sevinirim " 'CustomClass.init (bool)' en iyi aşırı yöntem maç bazı geçersiz argümanlar vardır."

Saygılarımızla, Chris

+3

Neden 'public void init (T defaultValue)' kullanmıyorsunuz? – jcolebrand

+6

Derleyici daha erken bir şekilde şikayet etmelidir: '' T: bool' nerede yapamazsınız. – dtb

+0

Ayrıca init sonra noktalı virgül yoktur (defaultValue) – Max

cevap

32

derleme zamanda Tbool olduğunu bilemez çünkü derleyici init(bool) kullanamaz. Ne soruyorsunuz dinamik gönderim - aslında hangi yöntemin argümanının çalışma zamanı türüne bağlı olduğu çağrılıyor ve derleme zamanında belirlenemiyor.

Sen dynamic türünü kullanarak C# 4.0 Bu başarabileceğini:

class CustomClass<T> 
{ 
    public CustomClass(T defaultValue) 
    { 
     init((dynamic)defaultValue); 
    } 
    private void init(bool defaultValue) { Console.WriteLine("bool"); } 
    private void init(int defaultValue) { Console.WriteLine("int"); } 
    private void init(object defaultValue) { 
     Console.WriteLine("fallback for all other types that don’t have "+ 
          "a more specific init()"); 
    } 
} 
+2

+1, Bu OP'nin almaya çalıştığı şey gibi görünüyor. Ayrıca, 'dinamik' ilginç kullanımı. Bazen 'switch' deyimini türlerle kullanmak istedim ve bu, etkiyi taklit etmenin ilginç bir yolu gibi görünüyor. –

+0

Hızlı cevabınız için çok teşekkür ederim. Benim düşünceme göre, derleme zamanında karar vermek mümkündü çünkü yapıcı programda zaten var olan bool ile çağırıyordu. Dinamik anahtar kelime güzel bir özelliktir. Bunu C# 3.5 kullanarak nasıl çözerim? – Chris

+1

@Chris: Yapıcıyı bir 'bool' ile çağırmanız, derleyicinin 'init (bool)' için bir çağrı gönderebileceği anlamına gelmez. Daha sonra başka bir meclisin farklı tür argümanlarıyla aynı kurucuyu arayabilirsiniz! - Ne yazık ki, çözümüm sadece C# 4.0 ve üstü ile çalışıyor. C# 3.5 yok. C# 3.0 kullanmanız gerekiyorsa (veya belki de .NET 3.5 demek istiyorsunuz?), Tek seçeneğiniz bir dizi “if ((object) defaultValue bool)… else…” kullanmaktır. – Timwi

İlgili konular