Invest in people before investing in tools

Il blog di Matteo Baglini
posts - 108, comments - 76, trackbacks - 2308

Extension Methods and Instace Methods Conflicts

Leggendo il libro LINQ in Action vinto ai Community Days 2008 (consegnato direttamente da Andrea) ho scoperto un comportamento degli Extension Methods che non conoscevo. Il quesito posto nel libro è: cosa succede se un Extension Method va in conflitto con un Instace Method? Semplicemente "perde la battaglia" in quanto un Extension Method ha una priorità più bassa. Riporto lo snippet e l'output presenti nel libro:

   1: using System;
   2:  
   3: namespace ExtensionMethods
   4: {
   5:     class Class1
   6:     {
   7:     }
   8:     class Class2
   9:     {
  10:         public void Method1(string s)
  11:         {
  12:             Console.WriteLine("Class2.Method1");
  13:         }
  14:     }
  15:     class Class3
  16:     {
  17:         public void Method1(object o)
  18:         {
  19:             Console.WriteLine("Class3.Method1");
  20:         }
  21:     }
  22:     class Class4
  23:     {
  24:         public void Method1(int i)
  25:         {
  26:             Console.WriteLine("Class4.Method1");
  27:         }
  28:     }
  29:     static class Extension
  30:     {
  31:         static public void Method1(this object o, int i)
  32:         {
  33:             Console.WriteLine("Extension.Method1");
  34:         }
  35:     }
  36:     class Program
  37:     {
  38:         static void Main(string[] args)
  39:         {
  40:             new Class1().Method1(12);
  41:             new Class2().Method1(12);
  42:             new Class3().Method1(12);
  43:             new Class4().Method1(12);
  44:         }
  45:     }
  46: }
   1: Extension.Method1
   2: Extension.Method1
   3: Class3.Method1
   4: Class4.Method1

Come dimostrato dallo snippet un Extension Method viene chiamato solo quando non esiste un Instace Method con la solita firma. In VB.NET per default non abbiamo il solito comportamento in quanto il compilatore se necessario effettua una conersione automatica dei tipi, quindi l'output sarà:

   1: Extension.Method1
   2: Class2.Method1
   3: Class3.Method1
   4: Class4.Method1

per evitare questo comportamento dobbiamo impostare Option Strict On, causando un errore di compilazione.

Technorati Tag: ,,

Print | posted on lunedì 14 luglio 2008 21.33 | Filed Under [ .NET ]

Feedback

Gravatar

# re: Extension Methods and Instace Methods Conflicts

Io ho ordinato da poco lo stesso libro su amazon... merita?
in ogni caso...
public static bool IsNull(this object obj) { return obj == null; }
se faccio poi
object o = null;
Console.WriteLine(o.IsNull());
che succede? :D
14/07/2008 23.16 | Diego Guidi
Gravatar

# re: Extension Methods and Instace Methods Conflicts

Ciao Diego!

Al momento ho letto quasi tre capitoli ed il giudizio è buono, quindi mi sento di consigliartelo.

il risultato del tuo snippet è true.
15/07/2008 9.16 | Matteo Baglini

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 2 and 1 and type the answer here:

Powered by: