Qualche giorno fa, su consiglio di Matteo, avevo fatto una segnalazione su Microsoft Connect relativa al fatto che la collezione MultiView.Views accetta oggetti di tipo Control, e non View, come sarebbe lecito attendersi (qui il post originale). Ieri sera ho ricevuto la risposta:
Since the Multiview control has already shipped in previous versions of the framework we cannot make the type of public properties more restrictive. Doing so would break existing code that passed in references typed as Control.
Che effettivamente era quello che mi aspettavo
. A questo punto, però, sarebbe interessante capire perché era stata fatta questa scelta progettuale...
Technorati Tag:
.NET,
ASP .NET
Come segnalato questa mattina da Alessandro, è stata rilasciata la CTP di ASP .NET 3.5 Extensions. Oltre alle risorse indicate sul blog di Scott Guthrie, è possibile dare un rapido sguardo alle principali novità che ci attendono leggendo questo post, che contiene anche qualche esempio di codice.
Il post di ieri di Daniele Mantovani mi ha fatto nascere un dubbio: dal momento che il Common Language Runtime del .NET Framework 3.5 è lo stesso della versione precedente e che gli extension methods sono semplicemente "zucchero sintattico", c'è un modo per utilizzarli anche con i progetti indirizzati a .NET 2.0? La risposta è... sì, è possibile!
Vediamo come fare. Creiamo un progetto .NET 2.0 con Visual Studio 2008 e definiamo la seguente classe:
1 using System;
2 using System.Text;
3
4 namespace ExtensionMethods
5 {
6 public static class Utils
7 {
8 public static byte[] GetBytes(this string str)
9 {
10 return Encoding.Default.GetBytes(str);
11 }
12 }
13 }
Provando a compilare, si ottiene il seguente messaggio di errore:
Cannot define a new extension method because the compiler required type 'System.Runtime.CompilerServices.ExtensionAttribute' cannot be found. Are you missing a reference to System.Core.dll?
Ovviamente, il codice non funziona perché il compilatore non trova l'attributo ExtensionAttribute, contenuto nell'assembly System.Core.dll, che fa parte di .NET 3.5 (Una piccola nota: utilizzare la parola chiave this prima del tipo dell'argomento accettato dal metodo (riga 8) equivale a dire che quel metodo deve essere decorato con l'attributo ExtensionAttribute). Tuttavia, andando ad indagare, si scopre che questo è un attributo "vuoto", ovvero non contiene proprietà sue: in pratica, serve solo al compilatore per fargli capire che stiamo definendo una nuova estensione per il tipo.
A questo punto ci si può chiedere: e se io mi definissi a mano l'attributo mancante? Proviamo. Aggiungiamo un nuovo namespace in fondo alla classe ExtensionMethods, in questo modo:
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute
{ }
}
In pratica, ci siamo definiti a mano l'attributo ExtensionAttribute. Se tentiamo una nuova compilazione, notiamo che ora fila tutto liscio! Facciamo un'ultima prova per verificare il corretto funzionamento. Spostiamoci in un'altra classe e digitiamo il seguente codice:
string s = "Marco";
Console.WriteLine(s.GetBytes()[0]);
Anche in questo caso, la compilazione avviene correttamente: il metodo GetBytes è stato riconosciuto come extension method per il tipo string.