<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Carillon .NET</title>
        <link>http://blogs.ugidotnet.org/adrian/category/308.aspx</link>
        <description>Carillon .NET</description>
        <language>it-IT</language>
        <copyright>Adrian Florea</copyright>
        <managingEditor>adrian_florea@yahoo.com</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <item>
            <title>Best practice Path.Combine</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/05/04/best-practice-path.combine.aspx</link>
            <description>&lt;p&gt;Se vogliamo che il nostro codice giri anche su Mono, dobbiamo utilizzare:&lt;/p&gt;
&lt;p&gt;Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "aaa.bbb")&lt;/p&gt;
&lt;p&gt;al posto di:&lt;/p&gt;
&lt;p&gt;AppDomain.CurrentDomain.BaseDirectory + "aaa.bbb"&lt;/p&gt;
&lt;p&gt;perche' su Mono, &lt;em&gt;BaseDirectory&lt;/em&gt; ritorna una stringa che non finisce in &lt;em&gt;Path.DirectorySeparatorChar&lt;/em&gt;, mentre su CLR si'. E questo va anche in generale, quando costruiamo il path da piu' pezzi, non solo nel caso della &lt;em&gt;BaseDirectory&lt;/em&gt;. Per esempio, chi utilizza &lt;a href="http://www.fyireporting.com/"&gt;fyiReporting RDL Project&lt;/a&gt; su Mono, dovrebbe modificare la riga 81 nel file Runtime/RdlEngineConfig.cs nei sorgenti del progetto e ricompilare, da:&lt;/p&gt;
&lt;p&gt;file = dir + "RdlEngineConfig.xml";&lt;/p&gt;
&lt;p&gt;a:&lt;/p&gt;
&lt;p&gt;file = Path.Combine(dir, "RdlEngineConfig.xml");&lt;/p&gt;
&lt;p&gt;perche' la stringa &lt;em&gt;dir&lt;/em&gt;, per come e' stata costruita, su CLR finisce in &lt;em&gt;Path.DirectorySeparatorChar&lt;/em&gt;, mentre su Mono no. In &lt;a href="http://www.amazon.com/Framework-Standard-Library-Annotated-Reference/dp/0321154894/"&gt;SLAR 1&lt;/a&gt; alla pagina 360, &lt;a href="http://joelmarcey.com/"&gt;Joel Marcey&lt;/a&gt; aggiunge questa nota sulla storia del metodo &lt;em&gt;Combine&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;The&lt;/em&gt; Combine &lt;em&gt;method had an interesting ride in the standardization process. It was originally part of the &lt;/em&gt;Path &lt;em&gt;class, then removed because it was thought to be too platform-specific, then added back because it was decided it was not any more platform-specific than any of the other methods in this class.&lt;/em&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/92512.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/05/04/best-practice-path.combine.aspx</guid>
            <pubDate>Mon, 05 May 2008 09:44:32 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/92512.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/05/04/best-practice-path.combine.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/92512.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/92512.aspx</trackback:ping>
        </item>
        <item>
            <title>Un'API generico a provider per i metadata dei vari ORM</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/05/03/unapi-generico-a-provider-per-i-metadata-dei-vari-orm.aspx</link>
            <description>&lt;p&gt;Via &lt;a href="http://weblogs.asp.net/fbouma/archive/2008/05/01/dynamic-data-and-3rd-party-o-r-mappers-is-a-fact.aspx"&gt;questo post&lt;/a&gt; di &lt;a href="http://weblogs.asp.net/fbouma/"&gt;Frans Bouma&lt;/a&gt; ho scoperto sotto il namespace &lt;strong&gt;System.Web.DynamicData.ModelProviders&lt;/strong&gt; dell'assembly &lt;strong&gt;System.Web.DynamicData.dll&lt;/strong&gt; che arriva con l'ultima release della preview di &lt;a href="http://code.msdn.microsoft.com/dynamicdata"&gt;ASP.NET Dynamic Data&lt;/a&gt;, un'API generico composto da 4 provider per i metadata dei vari ORM (non solo Microsoft): &lt;strong&gt;DataModelProvider&lt;/strong&gt;, &lt;strong&gt;TableProvider&lt;/strong&gt;, &lt;strong&gt;ColumnProvider&lt;/strong&gt; ed &lt;strong&gt;AssociationProvider&lt;/strong&gt;. Questo unifica in buona misura le varie API che espongono i metadata degli ORM, per esempio &lt;strong&gt;MetaTable&lt;/strong&gt;, &lt;strong&gt;MetaDataMember&lt;/strong&gt;, &lt;strong&gt;MetaAssociation&lt;/strong&gt; nel caso di LINQ to SQL, oppure quella piu' complessa dell'Entity Framework: &lt;strong&gt;EntitySet&lt;/strong&gt;, &lt;strong&gt;EdmMember&lt;/strong&gt;, &lt;strong&gt;NavigationProperty&lt;/strong&gt;, etc. Frans ha gia' scritto un &lt;em&gt;model provider&lt;/em&gt; per il suo &lt;a href="http://www.llblgen.com/"&gt;LLBLGen Pro&lt;/a&gt;, sarebbe bellissimo averne uno anche per &lt;a href="http://www.nhibernate.org/"&gt;NHibernate&lt;/a&gt;. E poi mi piacerebbe in futuro vedere questa API staccata dal ASP.NET Dynamics Data con cui non dovrebbe avere tanto in comune.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/92497.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/05/03/unapi-generico-a-provider-per-i-metadata-dei-vari-orm.aspx</guid>
            <pubDate>Sat, 03 May 2008 13:53:11 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/92497.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/05/03/unapi-generico-a-provider-per-i-metadata-dei-vari-orm.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/92497.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/92497.aspx</trackback:ping>
        </item>
        <item>
            <title>Brian Grunkemeyer sulla storia del TypeCode e dell'interfaccia IConvertible</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/03/17/91755.aspx</link>
            <description>&lt;p&gt;Visto l'interesse che ha suscitato &lt;a href="http://blogs.ugidotnet.org/adrian/archive/2008/03/12/91669.aspx"&gt;l'ultimo post&lt;/a&gt;, ho scritto a &lt;a href="http://blogs.msdn.com/brada"&gt;Brad Abrams&lt;/a&gt; chiedendo conferma per la mia supposizione e dettagli sulla storia dell'interfaccia IValue, lui mi risponde subito indirizzandomi a &lt;a href="http://blogs.msdn.com/bclteam/"&gt;Brian Grunkemeyer&lt;/a&gt; e stamattina trovo nella mia casella email, scritto da Brian, questo splendido pezzo della storia di .NET:&lt;/p&gt; &lt;blockquote&gt;
&lt;p&gt;This is a good question. I was digging through the history of this file to see if I could figure out what happened, and it’s not clear. We’ve had this “hole” in the TypeCode enum since October of 2000, and I can’t find an older set of bits. But, I’m sure that comment in IConvertible is right – this used to be TimeSpan. For TimeSpan, it’s possible we thought it would be interesting for a while, then we realized that frankly not that many people need to convert a Decimal to a TimeSpan, then removed it.&lt;/p&gt;
&lt;p&gt;You might ask why we didn’t “fix” the enum when we removed whichever of these values we had originally added. It turns out that whenever we have a breaking change internally, we need to recompile all the code that might possibly depend on the removed or changed public surface area. For us, that would mean rebuilding everything that might have referred to TypeCode.String, whose value would have changed from 18 to 17. While we do go through that process internally in DevDiv, it is costly &amp;amp; painful for us. Back then with some underdeveloped internal processes, it usually took 2 weeks, then even longer if your change requires a rebuilt compiler to be checked in as a new “safe” build of a compiler. Back in 2000, we were racing to ship as soon as possible (even though we didn’t ship for another year or two), so we wanted to limit churn like this. It’s sometimes easier to not deal with that level of churn in the product.&lt;/p&gt;
&lt;p&gt;For your other question about IValue, that was the original name for IConvertible. We exposed a Variant type to match OLE Automation’s VARIANT type on the native side, for COM Interop reasons. The VB team actually was thinking that Variant should be conceptually the root of their object hierarchy (at least in terms of how types were exposed in VB 7), but that seemed a little silly. Fortunately, Anders Hejlsberg convinced them to use Object instead and we’d expose IConvertible on the base data types to allow VB users to easily change from one data type to another. So we marked Variant internal &amp;amp; we only use it in a handful of places internally for COM-related functionality.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Grazie ragazzi!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/91755.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/03/17/91755.aspx</guid>
            <pubDate>Tue, 18 Mar 2008 06:24:33 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/91755.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/03/17/91755.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/91755.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/91755.aspx</trackback:ping>
        </item>
        <item>
            <title>Sull'enum TypeCode e sull'interfaccia fantoma IValue</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/03/12/91669.aspx</link>
            <description>&lt;p&gt;Oggi &lt;a href="http://blogs.ugidotnet.org/raffaele/"&gt;Raf&lt;/a&gt; sul messenger mi chiede se conosco un modo piu' diretto per capire se un tipo sia &lt;a href="http://msdn2.microsoft.com/en-us/library/system.type.isprimitive.aspx"&gt;primitivo&lt;/a&gt; oppure &lt;strong&gt;String&lt;/strong&gt; o &lt;strong&gt;DateTime&lt;/strong&gt; (questo per evitare degli &lt;em&gt;if&lt;/em&gt;...). Pensandoci un po', arrivo a questa soluzione:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(int)Type.GetTypeCode(type) &amp;gt; 2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;dove &lt;em&gt;type&lt;/em&gt; e' il tipo in causa. Lui prova e mi dice che va benissimo mentre io gia' sto pensando di bloggare questa riga di codice :-) L'enum &lt;a href="http://msdn2.microsoft.com/en-us/library/system.typecode.aspx"&gt;TypeCode&lt;/a&gt; infatti, contiene nella sua lista di valori maggiori a 2 tutti i 12 tipi &lt;strong&gt;primitivi&lt;/strong&gt; piu' il &lt;strong&gt;DateTime&lt;/strong&gt; e lo &lt;strong&gt;String&lt;/strong&gt;, proprio quello che voleva Raf. A questo punto gli chiedo come denominare questa categoria di tipi? Primitivi non sono, &lt;em&gt;built-in&lt;/em&gt; (&lt;a href="http://www.ecma-international.org/publications/standards/Ecma-335.htm"&gt;ECMA-335&lt;/a&gt;, &lt;strong&gt;Partition I&lt;/strong&gt;, &lt;strong&gt;8.2.2&lt;/strong&gt;) nemmeno, boh... &lt;em&gt;fondamentali&lt;/em&gt;? Qui Raf si ricorda che "&lt;em&gt;in una alpha erano refclass adesso non piu'&lt;/em&gt;". E poi fa questa osservazione giusta:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raffaele MVP says (4:45 PM):&lt;/strong&gt;&lt;br /&gt;
io comunque metterei &amp;gt;2 e &amp;lt;18&lt;br /&gt;
non si sa mai che aggiungano altre enum in futuro&lt;br /&gt;
&lt;strong&gt;&amp;lt;drian says (4:46 PM):&lt;/strong&gt;&lt;br /&gt;
hai visto che manca 17?&lt;br /&gt;
&lt;strong&gt;Raffaele MVP says (4:46 PM):&lt;/strong&gt;&lt;br /&gt;
non ci ho fatto caso&lt;br /&gt;
&lt;strong&gt;&amp;lt;drian says (4:47 PM):&lt;/strong&gt;&lt;br /&gt;
in questo caso, dovrei fare anche != 17, perche' il 17 per adesso manca&lt;br /&gt;
e diventa un po' una schifezza&lt;br /&gt;
&lt;strong&gt;Raffaele MVP says (4:48 PM):&lt;/strong&gt;&lt;br /&gt;
a questo punto puoi legarlo ad una versione specifica di quell'assembly ma poi non funziona più automaticamente&lt;br /&gt;
&lt;strong&gt;Raffaele MVP says (4:49 PM):&lt;/strong&gt;&lt;br /&gt;
o ancora metterlo typesafe&lt;br /&gt;
&amp;gt;=boolean &amp;lt;=string&lt;br /&gt;
ma c'è sempre il 17 a rompere &lt;/p&gt;
&lt;p&gt;Spulciando poi i sorgenti di &lt;a href="http://msdn.microsoft.com/net/sscli/"&gt;Rotor&lt;/a&gt;, trovo questo commento nel file dell'interfaccia &lt;strong&gt;System.IConvertible&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#339966"&gt;// The IValue interface represents an object that contains a value. This&lt;br /&gt;
// interface is implemented by the following types in the System namespace:&lt;br /&gt;
// &lt;strong&gt;Boolean&lt;/strong&gt;, &lt;strong&gt;Char&lt;/strong&gt;, &lt;strong&gt;SByte&lt;/strong&gt;, &lt;strong&gt;Byte&lt;/strong&gt;, &lt;strong&gt;Int16&lt;/strong&gt;, &lt;strong&gt;UInt16&lt;/strong&gt;, &lt;strong&gt;Int32&lt;/strong&gt;, &lt;strong&gt;UInt32&lt;/strong&gt;, &lt;strong&gt;Int64&lt;/strong&gt;, &lt;strong&gt;UInt64&lt;/strong&gt;,&lt;br /&gt;
// &lt;strong&gt;Single&lt;/strong&gt;, &lt;strong&gt;Double&lt;/strong&gt;, &lt;strong&gt;Decimal&lt;/strong&gt;, &lt;strong&gt;DateTime&lt;/strong&gt;, &lt;font color="#ff0000"&gt;&lt;strong&gt;TimeSpan&lt;/strong&gt;&lt;/font&gt;, and &lt;strong&gt;String&lt;/strong&gt;. The interface may&lt;br /&gt;
// be implemented by other types that are to be considered values.&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Cosa notate? Esattamente l'elenco di tipi che interessava Raf, nell'ordine di &lt;strong&gt;TypeCode&lt;/strong&gt; e... in piu' il &lt;strong&gt;&lt;font color="#ff0000"&gt;TimeSpan&lt;/font&gt;&lt;/strong&gt; tra il &lt;strong&gt;DateTime&lt;/strong&gt; = 16 e lo &lt;strong&gt;String&lt;/strong&gt; = 18, cioe' corrispondente proprio al &lt;strong&gt;&lt;font color="#ff0000"&gt;17&lt;/font&gt;&lt;/strong&gt; che mancava! Questa interfaccia, &lt;strong&gt;IValue&lt;/strong&gt;, non esiste piu' nel framework ma alcuni commenti su varie implementazioni del metodo &lt;strong&gt;GetTypeCode()&lt;/strong&gt; sono rimasti come:&lt;/p&gt;
&lt;p&gt;&lt;font color="#339966"&gt;// IValue implementation&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;perche', probabilmente, conteneva questo metodo &lt;strong&gt;GetTypeCode&lt;/strong&gt;. Questa ormai e' "&lt;em&gt;archeologia&lt;/em&gt;" di .NET! :-) E non e' tutto. Guardate nei commenti dell'enum &lt;strong&gt;System.TypeCode&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;font color="#339966"&gt;// Note that when an object has a given TypeCode, there is no guarantee that&lt;br /&gt;
// the object is an instance of the corresponding System.XXX value class. For&lt;br /&gt;
// example, &lt;strong&gt;an object with the type code TypeCode.Int32 might actually be an&lt;/strong&gt;&lt;br /&gt;
// &lt;strong&gt;instance of a nullable 32-bit integer type&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Questo comportamento non e' piu' vero, perche' il valore di &lt;strong&gt;Type.GetTypeCode(typeof(&lt;font color="#ff0000"&gt;int?&lt;/font&gt;))&lt;/strong&gt; e' &lt;strong&gt;TypeCode.&lt;font color="#ff0000"&gt;Object&lt;/font&gt;&lt;/strong&gt;, mentre il valore di &lt;strong&gt;Type.GetTypeCode(typeof(int))&lt;/strong&gt; e' &lt;strong&gt;TypeCode.Int32&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Dopo una discussione tecnica con Raf, direi che sia impossibile non cliccare "&lt;strong&gt;New Post&lt;/strong&gt;"! :-)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/91669.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/03/12/91669.aspx</guid>
            <pubDate>Wed, 12 Mar 2008 17:49:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/91669.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/03/12/91669.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/91669.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/91669.aspx</trackback:ping>
        </item>
        <item>
            <title>L'OR Designer e' stato scritto con DSL Tools</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/01/21/90790.aspx</link>
            <description>Lo sapevate che l'Object Relational Designer e la parte di generazione di codice per le classi LINQ to SQL in VS2008 sono state scritte utilizzando &lt;a href="http://www.microsoft.com/vstudio/dsltools"&gt;Microsoft DSL Tools&lt;/a&gt; che fa parte di &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=51A5C65B-C020-4E08-8AC0-3EB9C06996F4&amp;amp;displaylang=en"&gt;VS SDK&lt;/a&gt;? - l'ho scoperto tramite il Reflector mentre &lt;a href="http://www.domainspecificdevelopment.com/"&gt;studiavo&lt;/a&gt; l'API di questo potentissimo framework che e' DSL Tools: tra le classi che derivano da &lt;strong&gt;Microsoft.VisualStudio.Modeling.ModelElement&lt;/strong&gt;, classe fondamentale per la rappresentazione degli elementi di un domain model, si trovano anche le classi internal dell'OR Designer. Questo dovrebbe dare piu' fiduccia a chi inizia o valuta di &lt;a href="http://msdn.com/vsx"&gt;estendere Visual Studio&lt;/a&gt; per un certo DSL utilizzando DSL Tools! - parti complesse del VS stesso iniziano ad essere sviluppate con questo framework.&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/90790.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/01/21/90790.aspx</guid>
            <pubDate>Mon, 21 Jan 2008 14:29:06 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/90790.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/01/21/90790.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/90790.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/90790.aspx</trackback:ping>
        </item>
        <item>
            <title>raise accessor in C++/CLI</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/10/08/88834.aspx</link>
            <description>&lt;p&gt;Due anni e mezzo fa, parlavo in &lt;a href="http://blogs.ugidotnet.org/adrian/archive/2005/05/23/17175.aspx"&gt;questo post&lt;/a&gt;, di tre eventi all'interno delle classi del framework, tutti e tre nell'assembly &lt;em&gt;Microsoft.VisualBasic.dll&lt;/em&gt;, provvisti non solo dei classici accessor &lt;strong&gt;add&lt;/strong&gt; e &lt;strong&gt;remove&lt;/strong&gt;, ma anche di &lt;strong&gt;raise&lt;/strong&gt; (&lt;strong&gt;.fire&lt;/strong&gt; in IL), accessor che non esiste ancora in C# e finivo il post chiedendomi in quale linguaggio sia stato scritto quell'assembly, &lt;em&gt;Microsoft.VisualBasic.dll&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;E oggi scopro che C++/CLI (&lt;a href="http://www.ecma-international.org/publications/standards/Ecma-372.htm"&gt;ECMA-372&lt;/a&gt;, &lt;em&gt;19.6.2&lt;/em&gt;) mette a disposizione tre accessor anziche' due: &lt;strong&gt;add&lt;/strong&gt;, &lt;strong&gt;remove&lt;/strong&gt; e &lt;strong&gt;&lt;font color="#ff0000"&gt;raise&lt;/font&gt;&lt;/strong&gt;. Quindi, lo snippet del mio vecchio post, diventa in C++/CLI:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;delegate&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; FooFiredEvent();&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ref&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; Foo {&lt;br /&gt;
    FooFiredEvent^ m_FooFired;&lt;br /&gt;
&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt;: &lt;strong&gt;event&lt;/strong&gt; FooFiredEvent^ FooFired {&lt;br /&gt;
        &lt;strong&gt;void&lt;/strong&gt; add(FooFiredEvent^ value) {&lt;br /&gt;
            m_FooFired += value;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;strong&gt;void&lt;/strong&gt; remove(FooFiredEvent^ value) {&lt;br /&gt;
            m_FooFired -= value;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;font color="#ff0000"&gt;&lt;strong&gt;void&lt;/strong&gt; raise() {&lt;br /&gt;
            &lt;strong&gt;if&lt;/strong&gt;(m_FooFired) {&lt;br /&gt;
                m_FooFired();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;/font&gt;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/88834.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/10/08/88834.aspx</guid>
            <pubDate>Tue, 09 Oct 2007 09:37:28 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/88834.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/10/08/88834.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/88834.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/88834.aspx</trackback:ping>
        </item>
        <item>
            <title>Un modo di marcare il valore di default di un enum</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/07/28/86906.aspx</link>
            <description>&lt;P&gt;"&lt;I&gt;Do provide a value of zero on simple enums&lt;/I&gt;" dice una linea guida del &lt;A href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756/"&gt;FDG&lt;/A&gt; (p. 95). Ma forse sarebbe ancora piu' espressivo &lt;I&gt;marcare&lt;/I&gt; questo valore di default di un enum appunto come una &lt;I&gt;default value expression&lt;/I&gt; (&lt;A href="http://www.ecma-international.org/publications/standards/Ecma-334.htm"&gt;ECMA-334&lt;/A&gt;, 14.5.14) anziche' impostarlo a 0. Cioe', scrivere:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;public enum&lt;/STRONG&gt; Compression&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;None = (&lt;STRONG&gt;int&lt;/STRONG&gt;)&lt;STRONG&gt;default&lt;/STRONG&gt;(Compression),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GZip,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Deflate&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;al posto di None = 0. In ogni caso, il compilatore genera lo stesso IL. E' solo un'idea, che ne dite?&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/86906.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/07/28/86906.aspx</guid>
            <pubDate>Sun, 29 Jul 2007 07:12:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/86906.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/07/28/86906.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/86906.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/86906.aspx</trackback:ping>
        </item>
        <item>
            <title>GetCallingLanguage [la soluzione di un quiz di Claudio Brotto]</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/07/08/84939.aspx</link>
            <description>&lt;P&gt;Un po' di mesi fa, Claudio Brotto, aveva proposto &lt;A href="http://blogs.devleap.com/devlizard/archive/2006/11/01/vb-net-e-c-che-differenza-passa-fra.aspx"&gt;un simpatico quiz&lt;/A&gt; a cui vorrei dare adesso una soluzione (in realta' la soluzione e' per una variante leggermente modificata del quiz). Si tratta praticamente di scrivere un metodo pubblico in un assembly in tal modo che, chiamandolo da un altro assembly, questo metodo produca una stringa diversa in base al linguaggio in cui e' stato scritto l'assembly chiamante. Per esempio, questo metodo dovrebbe ritornare la stringa "&lt;STRONG&gt;C#&lt;/STRONG&gt;" se chiamato da un assembly scritto in C#, oppure "&lt;STRONG&gt;Basic&lt;/STRONG&gt;" se chiamato da un assembly scritto in VB.NET, etc. Piccolo vincolo della mia soluzione: l'assembly chiamante &lt;EM&gt;deve&lt;/EM&gt; essere compilato in debug mode.&lt;/P&gt;
&lt;P&gt;Tutto si basa su un metadato che il compilatore inserisce nell'assembly quando compiliamo in debug mode e che serve ai vari debugger. Cercate nel file "foo.il" ottenuto da un &amp;#8220;foo.cs&amp;#8220; qualunque:&lt;/P&gt;
&lt;P&gt;&lt;B&gt;csc /debug+ foo.cs&lt;BR&gt;ildasm foo.exe /linenum /out:foo.il/&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;la direttiva "&lt;B&gt;.language&lt;/B&gt;" (vedi &lt;B&gt;C.3&lt;/B&gt;, &lt;I&gt;Partition VI&lt;/I&gt;, &lt;A href="http://www.ecma-international.org/publications/standards/Ecma-335.htm"&gt;ECMA-335&lt;/A&gt;) e troverete 3 GUID che identificano rispettivamente il linguaggio, il vendor (cioe' il compilatore) e il documento. Solo il primo, cioe' il GUID del linguaggio, e' obbligatorio nella direttiva "&lt;B&gt;.language&lt;/B&gt;". Per vedere l'elenco dei linguaggi mappati da questi GUID, andate nel file "C:\Program Files\Microsoft.NET\SDK\v2.0\include\corsym.h".&lt;/P&gt;
&lt;P&gt;Come possiamo pero' ottenere dal codice, questa informazione? Dopo un po' di giri col &lt;EM&gt;Reflector&lt;/EM&gt;, ho trovato la classe giusta, &lt;B&gt;System.Diagnostics.SymbolStore.SymDocument&lt;/B&gt;, nell'assembly "&lt;STRONG&gt;ISymWrapper.dll&lt;/STRONG&gt;" (nella cartella del framework). In questa classe notiamo la proprieta' &lt;B&gt;Language&lt;/B&gt; di tipo Guid che ci dara' il GUID del linguaggio, incontrato sopra nel file ".il". Il costruttore di questa classe, nonostante pubblico, non ci aiuta tanto, visto il pointer bruttino che non possiamo passarglielo come argomento... Ma sempre coll'aiuto del &lt;EM&gt;Reflector&lt;/EM&gt;, scopriamo chi utilizza questa interessante classe: il metodo &lt;B&gt;GetDocuments&lt;/B&gt; della classe &lt;B&gt;System.Diagnostics.SymbolStore.SymReader&lt;/B&gt;. E qui la stessa storia&amp;nbsp;per il&amp;nbsp;suo costruttore pubblico, ma indagando che altra classe utilizza la &lt;B&gt;SymReader&lt;/B&gt;, arriviamo alla &lt;B&gt;System.Diagnostics.SymbolStore.SymBinder&lt;/B&gt;, che finalmente ha un costruttore pubblico senza parametri!&lt;/P&gt;
&lt;P&gt;Bene, in questa classe &lt;B&gt;SymBinder&lt;/B&gt;, andiamo a vedere un po' il metodo &lt;B&gt;GetReader&lt;/B&gt; con il quale potremo ottenere un'istanza di &lt;B&gt;SymReader&lt;/B&gt;, e da qui ottenere un'istanza di &lt;B&gt;SymDocument&lt;/B&gt;, per arrivare poi al GUID del linguaggio.&lt;/P&gt;
&lt;P&gt;In questo metodo &lt;STRONG&gt;GetReader&lt;/STRONG&gt;, incontriamo un parametro chiamato "&lt;I&gt;importer&lt;/I&gt;", di tipo IntPtr, che punta (dice la documentazione) sulla "&lt;I&gt;metadata import interface&lt;/I&gt;". Questa interfaccia, &lt;B&gt;IMetadataImport&lt;/B&gt;, si trova, insieme alle altre interfacce &lt;I&gt;unmanaged&lt;/I&gt; per i metadati, documentata nel MSDN a &lt;A href="https://msdn2.microsoft.com/en-us/library/ms233411.aspx"&gt;questa pagina&lt;/A&gt; probabilmente poco visitata. Il giro non e' finito perche', per ottenere un'istanza &lt;I&gt;importer&lt;/I&gt; di &lt;B&gt;IMetadataImport&lt;/B&gt;, abbiamo bisogno di un "&lt;I&gt;dispenser&lt;/I&gt;" a cui chiedere di aprire il file dell'assembly (tramite il metodo &lt;B&gt;OpenState&lt;/B&gt;) e trovare l'istanza dell'&lt;I&gt;importer&lt;/I&gt; in un parametro &lt;B&gt;out&lt;/B&gt;. L'istanza del "&lt;I&gt;dispenser&lt;/I&gt;" la otteniamo conoscendo il &lt;B&gt;CLSID_CorMetaDataDispenser&lt;/B&gt; (vedi il file "cor.h" - l'header generale del runtime se avete downloadato il &lt;A href="http://research.microsoft.com/sscli/"&gt;SSCLI (Rotor)&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;Dobbiamo definirci queste due interfacce &lt;I&gt;unmanaged&lt;/I&gt;, decorandole con i loro GUID presi sempre dal file "cor.h", ma senza dover definire necessariamente i metodi che non ci interessano - per questo motivo ho messo dei metodi &lt;B&gt;Dummy&lt;/B&gt;, semplicemente per occupare lo slot di un metodo che non ci interessa e per poter cosi' arrivare correttamente al metodo &lt;B&gt;OpenState&lt;/B&gt; che e' il secondo metodo dell'interfaccia.&lt;/P&gt;
&lt;P&gt;Quello che ho detto sopra, viene implementato cosi' (sicuramente non e' perfetto come codice ma serve solo per illustrare il concetto):&lt;/P&gt;
&lt;P&gt;// foo.cs&lt;BR&gt;// csc /t:library /r:ISymWrapper.dll foo.cs&lt;BR&gt;using System;&lt;BR&gt;using System.Reflection;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Runtime.InteropServices;&lt;BR&gt;using System.Diagnostics.SymbolStore;&lt;BR&gt;using System.Diagnostics;&lt;BR&gt;&lt;BR&gt;[&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44"),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InterfaceType(ComInterfaceType.InterfaceIsIUnknown),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComVisible(true)&lt;BR&gt;]&lt;BR&gt;public interface IMetadataImport&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void Dummy();&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;[&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid("809c652e-7396-11d2-9771-00a0c9b4d50c"),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InterfaceType(ComInterfaceType.InterfaceIsIUnknown),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComVisible(true)&lt;BR&gt;]&lt;BR&gt;interface IMetaDataDispenser&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void Dummy(); // DefineScope&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// https://msdn2.microsoft.com/en-us/library/ms231248.aspx&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void OpenScope&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[In, MarshalAs(UnmanagedType.LPWStr)] string szScope,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[In] int dwOpenFlags,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[In] ref Guid riid,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Out, MarshalAs(UnmanagedType.IUnknown)] out object ppIUnk&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;public class Metadata&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static string GetCallingLanguage()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assembly assembly = Assembly.GetCallingAssembly();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (DebuggableAttribute attribute in assembly.GetCustomAttributes(typeof(DebuggableAttribute), false))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!attribute.IsJITTrackingEnabled)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new NotSupportedException("Calling assembly not built in Debug mode");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string location = assembly.Location;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid CLSID_CorMetaDataDispenser = new Guid("e5cb7a31-7512-11d2-89ce-0080c792e5d8");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid IID_IMetadataImport = new Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44");&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;object importerObj;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IMetaDataDispenser dispenser = (IMetaDataDispenser)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_CorMetaDataDispenser));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dispenser.OpenScope(location, 0, ref IID_IMetadataImport, out importerObj);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr importer = Marshal.GetComInterfaceForObject(importerObj, typeof(IMetadataImport));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ISymbolReader reader = new SymBinder().GetReader(importer, location, string.Empty);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// see LanguageType module in&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// C:\Program Files\Microsoft.NET\SDK\v2.0\include\corsym.h&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dictionary&lt;GUID, string&gt; languages = new Dictionary&lt;GUID, string&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;languages.Add(new Guid("3f5162f8-07c6-11d3-9053-00c04fa302a1"), "C#");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;languages.Add(new Guid("3a12d0b8-c26c-11d0-b442-00a0244a1dd2"), "Basic");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ...&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return languages[reader.GetDocuments()[0].Language];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;} &lt;/P&gt;
&lt;P&gt;Adesso, questo codice:&lt;/P&gt;
&lt;P&gt;// bar.cs&lt;BR&gt;// csc /r:foo.dll /debug+ bar.cs&lt;BR&gt;class Test&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static void Main()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine(Metadata.GetCallingLanguage());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;} &lt;/P&gt;
&lt;P&gt;stampera' &lt;B&gt;C#&lt;/B&gt; a console, mentre questo:&lt;/P&gt;
&lt;P&gt;' bar.vb&lt;BR&gt;' vbc /r:foo.dll /debug+ bar.vb&lt;BR&gt;Class Test&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Shared Sub Main&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine(Metadata.GetCallingLanguage())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Sub&lt;BR&gt;End Class &lt;/P&gt;
&lt;P&gt;che e' &lt;I&gt;identico&lt;/I&gt; con quello C# ma scritto in VB.NET, stampera' &lt;B&gt;Basic&lt;/B&gt; :-)&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/84939.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/07/08/84939.aspx</guid>
            <pubDate>Mon, 09 Jul 2007 06:04:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/84939.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/07/08/84939.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/84939.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/84939.aspx</trackback:ping>
        </item>
        <item>
            <title>Le 19 cose impossibili delle classi statiche</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/03/23/73690.aspx</link>
            <description>&lt;P&gt;Per ottenere l'elenco completo delle cose che&amp;nbsp;NON si possono fare con le classi statiche, e' piu' facile andare nel file "&lt;EM&gt;errors.h&lt;/EM&gt;" di &lt;A href="http://msdn.microsoft.com/net/sscli/"&gt;SSCLI 2.0&lt;/A&gt; e cercare gli errori che riguardano le static class. L'elenco ottenuto e' piu' dettagliato rispetto a quello del paragrafo 17.1.1.3 delle &lt;A href="http://www.ecma-international.org/publications/standards/Ecma-334.htm"&gt;specifiche&lt;/A&gt;:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/32twkh69(VS.80).aspx"&gt;CS0418&lt;/A&gt;, &lt;STRONG&gt;AbstractSealed&lt;SPAN class=style1&gt;Static&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;una classe astratta non pu&amp;#242; essere &lt;/EM&gt;sealed&lt;EM&gt; o &lt;/EM&gt;static")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/c9kbe16a(VS.80).aspx"&gt;CS0441&lt;/A&gt;, &lt;STRONG&gt;Sealed&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;una classe non pu&amp;#242; essere contemporaneamente &lt;/EM&gt;static&lt;EM&gt; e &lt;/EM&gt;sealed")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/a3f73dyh(VS.80).aspx"&gt;CS0708&lt;/A&gt;, &lt;STRONG&gt;InstanceMemberIn&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;impossibile dichiarare membri di istanza in una classe statica&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/c7b91dfc(VS.80).aspx"&gt;CS0709&lt;/A&gt;, &lt;STRONG&gt;&lt;SPAN class=style1&gt;Static&lt;/SPAN&gt;Base&lt;SPAN class=style1&gt;Class&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;una classe non pu&amp;#242; derivare da una classe statica&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/78z8kh57(VS.80).aspx"&gt;CS0710&lt;/A&gt;, &lt;STRONG&gt;ConstructorIn&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;le classi statiche non possono avere costruttori di istanza&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/y9f2csf3(VS.80).aspx"&gt;CS0711&lt;/A&gt;, &lt;STRONG&gt;DestructorIn&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;le classi statiche non possono contenere distruttori&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/e216eb16(VS.80).aspx"&gt;CS0712&lt;/A&gt;, &lt;STRONG&gt;Instantiating&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;impossibile creare un'istanza della classe statica&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/zhwc5b81(VS.80).aspx"&gt;CS0713&lt;/A&gt;, &lt;STRONG&gt;&lt;SPAN class=style1&gt;Static&lt;/SPAN&gt;DerivedFromNonObject&lt;/STRONG&gt; ("&lt;EM&gt;le classi statiche devono derivare da &lt;/EM&gt;System.Object")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/hs6caw2a(VS.80).aspx"&gt;CS0714&lt;/A&gt;, &lt;STRONG&gt;&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;InterfaceImpl&lt;/STRONG&gt; ("&lt;EM&gt;le classi statiche non possono implementare interfacce&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/7yc752x3(VS.80).aspx"&gt;CS0715&lt;/A&gt;, &lt;STRONG&gt;OperatorIn&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;le classi statiche non possono contenere operatori definiti dall'utente&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/2tkd28c0(VS.80).aspx"&gt;CS0716&lt;/A&gt;, &lt;STRONG&gt;ConvertTo&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;impossibile convertire in un tipo statico&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/dw57t30z(VS.80).aspx"&gt;CS0717&lt;/A&gt;, &lt;STRONG&gt;ConstraintIs&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;impossibile utilizzare le classi statiche come vincoli&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/sxe6t54y(VS.80).aspx"&gt;CS0718&lt;/A&gt;, &lt;STRONG&gt;GenericArgIs&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;impossibile utilizzare tipi statici come argomenti generici&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/b5fc0hec(VS.80).aspx"&gt;CS0719&lt;/A&gt;, &lt;STRONG&gt;ArrayOf&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;gli elementi di una matrice non possono essere di tipo statico&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/91210466(VS.80).aspx"&gt;CS0720&lt;/A&gt;, &lt;STRONG&gt;IndexerIn&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;impossibile dichiarare indicizzatori in una classe statica&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/td8fh082(VS.80).aspx"&gt;CS0721&lt;/A&gt;, &lt;STRONG&gt;ParameterIs&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;impossibile utilizzare tipi statici come parametri&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/819ct9a6(VS.80).aspx"&gt;CS0722&lt;/A&gt;, &lt;STRONG&gt;ReturnTypeIs&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;impossibile utilizzare tipi statici come tipi restituiti&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/c695wy98(VS.80).aspx"&gt;CS0723&lt;/A&gt;, &lt;STRONG&gt;VarDeclIs&lt;SPAN class=style1&gt;StaticClass&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;impossibile dichiarare una variabile di un tipo statico&lt;/EM&gt;")&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/it-it/library/ms228373(vs.80).aspx"&gt;CS1057&lt;/A&gt;, &lt;STRONG&gt;ProtectedIn&lt;SPAN class=style1&gt;Static&lt;/SPAN&gt;&lt;/STRONG&gt; ("&lt;EM&gt;le classi statiche non possono contenere membri &lt;/EM&gt;protected&lt;EM&gt; o &lt;/EM&gt;protected internal")&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Magari a qualcuno serve come riferimento.&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/73690.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/03/23/73690.aspx</guid>
            <pubDate>Sat, 24 Mar 2007 01:43:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/73690.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/03/23/73690.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/73690.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/73690.aspx</trackback:ping>
        </item>
        <item>
            <title>Quiz Sharp #61 [la soluzione]</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/03/21/73452.aspx</link>
            <description>&lt;P&gt;La soluzione al &lt;A href="http://blogs.ugidotnet.org/adrian/archive/2007/03/09/72692.aspx"&gt;Quiz Sharp #61&lt;/A&gt; mi sembra abbastanza interessante per meritare un post a parte (nomi come &lt;A href="http://tirania.org/blog/archive/2007/Mar-13-1.html"&gt;Miguel de Icaza&lt;/A&gt;, &lt;A href="http://discuss.develop.com/archives/wa.exe?A2=ind0602d&amp;amp;L=dotnet-clr&amp;amp;D=1&amp;amp;O=A&amp;amp;P=644"&gt;Jon Skeet&lt;/A&gt;, &lt;A href="http://blogs.msdn.com/abhinaba/archive/2005/12/11/501544.aspx"&gt;Abhinaba Basu&lt;/A&gt;, hanno considerato strano il comportamento del compilatore C# 2.0 nel comparare i valori value type a &lt;STRONG&gt;null&lt;/STRONG&gt;)&lt;/P&gt;
&lt;P&gt;La risposta corretta al quiz e' che eseguendo lo snippet si ottiene un'eccezione a runtime (&lt;EM&gt;StackOverflowException&lt;/EM&gt;). Vediamo di seguito il perche', con &lt;A href="http://www.ecma-international.org/publications/standards/Ecma-334.htm"&gt;le specifiche&lt;/A&gt; in mano:&lt;/P&gt;
&lt;P&gt;Per evaluare l'espressione &lt;EM&gt;value != null&lt;/EM&gt; nell'implementazione dell'operatore, dove &lt;EM&gt;value&lt;/EM&gt; e' un not-nullable value type, il compilatore applica alcune conversioni. Per esempio, per ogni nullable type, esiste una conversione implicita dal tipo null al tipo nullable (ECMA-334, 13.7.1). Inoltre, una volta definito l'operatore di conversione implicita da &lt;EM&gt;Foo&lt;/EM&gt; a &lt;STRONG&gt;bool&lt;/STRONG&gt;, in cui sia &lt;EM&gt;Foo&lt;/EM&gt; che &lt;STRONG&gt;bool&lt;/STRONG&gt; sono not-nullable value types, esistono automaticamente anche le conversioni nullable (ECMA-334, 13.7.2) implicite da &lt;EM&gt;Foo?&lt;/EM&gt; a &lt;STRONG&gt;bool?&lt;/STRONG&gt; e da &lt;EM&gt;Foo&lt;/EM&gt; a &lt;STRONG&gt;bool?&lt;/STRONG&gt; e la conversione esplicita da &lt;EM&gt;Foo?&lt;/EM&gt; a &lt;STRONG&gt;bool&lt;/STRONG&gt;. Quest'ultima non ci interessa perche' e' esplicita. Ci interessa invece quella da &lt;EM&gt;Foo&lt;/EM&gt; a &lt;STRONG&gt;bool?&lt;/STRONG&gt; perche', in questo modo, la comparazione a &lt;STRONG&gt;null&lt;/STRONG&gt; nell'espressione si farebbe tra due nullable types (&lt;STRONG&gt;bool?&lt;/STRONG&gt; entrambi). Su come si applica la nullable conversion da &lt;EM&gt;Foo&lt;/EM&gt; a &lt;STRONG&gt;bool?&lt;/STRONG&gt;, c'e' scritto nelle specifiche (13.7.2): "&lt;EM&gt;If the nullable conversion is from S to T?, the conversion is evaluated as the underlying conversion from S to T followed by a wrapping from T to T?&lt;/EM&gt;", quindi prima si applica la conversione sottostante, da &lt;EM&gt;Foo&lt;/EM&gt; a &lt;STRONG&gt;bool&lt;/STRONG&gt;, seguita poi da quella da &lt;STRONG&gt;bool&lt;/STRONG&gt; a &lt;STRONG&gt;bool?&lt;/STRONG&gt;. Ma quella da &lt;EM&gt;Foo&lt;/EM&gt; a &lt;STRONG&gt;bool&lt;/STRONG&gt; e' proprio la conversione implicita che stiamo implementando, percio' siamo nella ricorsione che ci porta alla &lt;EM&gt;StackOverflowException&lt;/EM&gt;... Tra l'altro, il compilatore C# ci avverte con il warning &lt;STRONG&gt;CS0472&lt;/STRONG&gt;: "&lt;EM&gt;The result of the expression is always '&lt;/EM&gt;&lt;STRONG&gt;true&lt;/STRONG&gt;&lt;EM&gt;' since a value of type '&lt;/EM&gt;&lt;STRONG&gt;bool&lt;/STRONG&gt;&lt;EM&gt;' is never equal to '&lt;/EM&gt;&lt;STRONG&gt;null&lt;/STRONG&gt;&lt;EM&gt;' of type '&lt;/EM&gt;&lt;STRONG&gt;bool?&lt;/STRONG&gt;&lt;EM&gt;'&lt;/EM&gt;", quindi "&lt;STRONG&gt;null&lt;/STRONG&gt; of type &lt;STRONG&gt;bool?&lt;/STRONG&gt;" perche' e' gia' stata identificata la conversione nullable.&lt;/P&gt;
&lt;P&gt;Per chi vuole spulciare nel codice di &lt;A href="http://blogs.ugidotnet.org/adrian/admin/msdn.microsoft.com/net/sscli/"&gt;SSCLI 2.0&lt;/A&gt;, da guardare &lt;EM&gt;FUNCBREC::BindNubEqOpCore&lt;/EM&gt; nel file "operators.cpp".&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/73452.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/03/21/73452.aspx</guid>
            <pubDate>Thu, 22 Mar 2007 05:36:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/73452.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/03/21/73452.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/73452.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/73452.aspx</trackback:ping>
        </item>
    </channel>
</rss>