<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rob Windsor's Weblog : C#</title><link>http://msmvps.com/blogs/windsor/archive/tags/C_2300_/default.aspx</link><description>Tags: C#</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Visual Studio 2008 "How Do I" Videos</title><link>http://msmvps.com/blogs/windsor/archive/2007/10/16/visual-studio-2008-quot-how-do-i-quot-videos.aspx</link><pubDate>Tue, 16 Oct 2007 01:56:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1247963</guid><dc:creator>windsor</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/windsor/rsscomments.aspx?PostID=1247963</wfw:commentRss><comments>http://msmvps.com/blogs/windsor/archive/2007/10/16/visual-studio-2008-quot-how-do-i-quot-videos.aspx#comments</comments><description>&lt;p&gt;If you&amp;#39;re interested in seeing some of the new features of Visual Studio 2008 in action, you should check out the series of &amp;quot;How Do I&amp;quot; videos at &lt;a title="http://www.visualstudio2008beta.com/videos.htm" href="http://www.visualstudio2008beta.com/videos.htm"&gt;http://www.visualstudio2008beta.com/videos.htm&lt;/a&gt;. There are 13 up there now and&amp;nbsp;more will be added every week. If you want to play along, head on over to&amp;nbsp;&lt;a title="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx" href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx"&gt;http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx&lt;/a&gt;&amp;nbsp;and download a copy of Beta 2 for yourself. &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://feeds.feedburner.com/~s/rwindsor?i=http://msmvps.com/blogs/windsor/archive/2007/10/16/visual-studio-2008-quot-how-do-i-quot-videos.aspx" type="text/javascript"&gt;&lt;/script&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1247963" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/windsor/archive/tags/Development/default.aspx">Development</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/Training/default.aspx">Training</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/DevCenter/default.aspx">DevCenter</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/Videos/default.aspx">Videos</category></item><item><title>Some Specifics on Generics</title><link>http://msmvps.com/blogs/windsor/archive/2007/01/03/some-specifics-on-generics.aspx</link><pubDate>Wed, 03 Jan 2007 09:07:56 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:466635</guid><dc:creator>windsor</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/windsor/rsscomments.aspx?PostID=466635</wfw:commentRss><comments>http://msmvps.com/blogs/windsor/archive/2007/01/03/some-specifics-on-generics.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Generics are the most significant language addition to .NET 2.0. They allow for code re-use in ways not previously available and make it much easier to write type-safe, better performing code. That is, they help you turn runtime exceptions into compile-time errors while making your application run faster. Sound good?  &lt;p&gt;&lt;strong&gt;What’s the Problem?&lt;/strong&gt;&lt;br /&gt;The classic example used to demonstrate the problem Generics solve is the general purpose collection. In .NET 1.1 collection classes like the ArrayList and HashTable are object based so they can store data of any type. Unfortunately this benefit has a cost, the lack of type safety. The user of the ArrayList cannot restrict the types it stores, which can potentially lead to runtime errors.&lt;/p&gt; &lt;p&gt; &lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; al &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; ArrayList()&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(11)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(42)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(18.0)&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39; will cause a runtime error in the for loop&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; sum &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt; = 0&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;For&lt;/span&gt; i &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt; = 0 &lt;span style="color:blue;"&gt;To&lt;/span&gt; al.Count&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; sum += &lt;span style="color:blue;"&gt;CInt&lt;/span&gt;(al(i))&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;ArrayList al = &lt;span style="color:blue;"&gt;new&lt;/span&gt; ArrayList();&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(11);&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(42);&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(18.0);&amp;nbsp; &lt;span style="color:green;"&gt;// will cause a runtime error in the for loop&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt; sum = 0;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;for&lt;/span&gt; (&lt;span style="color:blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; al.Count; i++) { sum += (&lt;span style="color:blue;"&gt;int&lt;/span&gt;)al&lt;img src="http://msmvps.com/emoticons/emotion-55.gif" alt="Idea" /&gt;; }&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The solution to this problem in .NET 1.1 is to create a strongly-type collection class by inheriting from CollectionBase (or DictionaryBase is you want HashTable like functionality). While this task is not difficult it is tedious and leads to code bloat. You have to write almost exactly the same code for each and every type which requires a strongly-typed collection.&lt;/p&gt;
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; IntCollection&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; CollectionBase&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Default&lt;/span&gt; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Item(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; index &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; (&lt;span style="color:blue;"&gt;CType&lt;/span&gt;(List(index), &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List(index) = Value&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Add(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; (List.Add(value))&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; IndexOf(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; (List.IndexOf(value))&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Insert(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; index &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List.Insert(index, value)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Remove(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List.Remove(value)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:teal;"&gt;IntCollection&lt;/span&gt; : CollectionBase&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;[&lt;span style="color:blue;"&gt;int&lt;/span&gt; index]&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; ((&lt;span style="color:blue;"&gt;int&lt;/span&gt;)List[index]); }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;set&lt;/span&gt; { List[index] = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; Add(&lt;span style="color:blue;"&gt;int&lt;/span&gt; value)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; (List.Add(value));&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; IndexOf(&lt;span style="color:blue;"&gt;int&lt;/span&gt; value)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; (List.IndexOf(value));&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Insert(&lt;span style="color:blue;"&gt;int&lt;/span&gt; index, &lt;span style="color:blue;"&gt;int&lt;/span&gt; value)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List.Insert(index, value);&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Remove(&lt;span style="color:blue;"&gt;int&lt;/span&gt; value)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List.Remove(value);&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;A second problem is performance. Value types need to be boxed when being added to the collection and the unboxed when they are retrieved. This is a “double whammy” because not only do you pay the penalty for boxing but you also add more and more work to the garbage collection mechanism as the collection grows. Even if you’re storing reference types there is still some penalty for casting. 
&lt;p&gt;&lt;strong&gt;Using Generics&lt;br /&gt;&lt;/strong&gt;Generics are designed to address the issues stated above without sacrificing developer productivity. The idea is to allow classes to be parameterized by the types they store and manipulate. The type parameter or parameters, which are enclosed in angle brackets and separated by commas, can be added to a class or method declaration. The type parameter acts as a placeholder for the actual type that will be used at runtime. For example you could create a generic Stack class: 
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; Stack(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _items &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; List(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Push(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; item &lt;span style="color:blue;"&gt;As&lt;/span&gt; T)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _items.Add(item)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Pop() &lt;span style="color:blue;"&gt;As&lt;/span&gt; T&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; _items.Count = 0 &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; InvalidOperationException(&lt;span style="color:maroon;"&gt;&amp;quot;Stack is empty&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; index &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt; = _items.Count - 1&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; item &lt;span style="color:blue;"&gt;As&lt;/span&gt; T = _items(index)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _items.RemoveAt(index)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; item&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:teal;"&gt;Stack&lt;/span&gt;&amp;lt;T&amp;gt; {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:teal;"&gt;List&lt;/span&gt;&amp;lt;T&amp;gt; _items = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;List&lt;/span&gt;&amp;lt;T&amp;gt;();&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Push(T item) { _items.Add(item); }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; T Pop() {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_items.Count == 0) {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;InvalidOperationException&lt;/span&gt;(“Stack &lt;span style="color:blue;"&gt;is&lt;/span&gt; empty”);&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; index = _items.Count – 1;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; T item = _items[index];&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _items.RemoveAt(index);&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; item;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this case the type parameter is &lt;strong&gt;T&lt;/strong&gt; (it is common practice to use a single capital letter as the name for a type parameter but you are free to use more descriptive names if you choose) so the type would be know as “Stack of T”. T is used as the type for the regular parameter to Push and the return type of Pop. It is interesting to note that it is also used as the type argument in the construction of the internal List of items. The type argument defines the specific type you wish to use for that instance of the generic class. 
&lt;p&gt;The .NET Framework 2.0 adds several new generic collection classes in the System.Collections.Generic namespace, the most commonly used being List&amp;lt;T&amp;gt; (the generic version of ArrayList) and Dictionary&amp;lt;K, T&amp;gt; (the generic version of HashTable). 
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; al &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; List(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(11)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(42)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(18.0)&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39; will cause a complie time error&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; sum &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt; = 0&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;For&lt;/span&gt; i &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt; = 0 &lt;span style="color:blue;"&gt;To&lt;/span&gt; al.Count&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; sum += al(i)&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39; no cast or unboxing required&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt; al = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(11);&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(42);&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;al.Add(18.0);&amp;nbsp; &lt;span style="color:green;"&gt;//will cause a complie time error&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt; sum = 0;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;for&lt;/span&gt; (&lt;span style="color:blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; al.Count; i++) { &lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; sum += al&lt;img src="http://msmvps.com/emoticons/emotion-55.gif" alt="Idea" /&gt;; &lt;span style="color:green;"&gt;// no cast or unboxing required&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generic Methods&lt;br /&gt;&lt;/strong&gt;You have seen adding type parameters to classes, you can do the same thing for methods. This can be done even if the class itself is not generic. To do this you use the same syntax style as with classes, adding the type parameter after the name of the method but before the regular parameter list. 
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; Utility&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Max(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; a &lt;span style="color:blue;"&gt;As&lt;/span&gt; T, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; b &lt;span style="color:blue;"&gt;As&lt;/span&gt; T) &lt;span style="color:blue;"&gt;As&lt;/span&gt; T&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; a &amp;gt; b &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; a&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; b&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&amp;#39; usage of Max&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; MaxTest()&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; u &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Utility()&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; i &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt; = u.Max(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)(7, 11)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39; Use type inference&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; d &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Double&lt;/span&gt; = u.Max(10.0, 42.42)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:teal;"&gt;Utility&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; T Max&amp;lt;T&amp;gt;(T a, T b)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (a &amp;gt; b) { &lt;span style="color:blue;"&gt;return&lt;/span&gt; a; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; b;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// usage of Max&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; MaxTest()&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:teal;"&gt;Utility&lt;/span&gt; u = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;Utility&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; i = u.Max&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;(7, 11);&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;double&lt;/span&gt; d = u.Max(10.0, 42.42);&amp;nbsp; &lt;span style="color:green;"&gt;//OK, uses type inference&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;When using generic methods, the C# compiler is able to infer the type arguments from the types of the regular parameters passed so you do not have to explicitly state them. 
&lt;p&gt;&lt;strong&gt;Constraints&lt;/strong&gt;&lt;br /&gt;Time to “fess up”, the code for the Max method in the example directly above does not compile. The condition (a &amp;gt; b) causes a compiler error because it does not have meaning for all possible values of T. To get it to work you need to modify the code somewhat. 
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; Utility&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Max(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; a &lt;span style="color:blue;"&gt;As&lt;/span&gt; T, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; b &lt;span style="color:blue;"&gt;As&lt;/span&gt; T)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; a.CompareTo(b) &amp;gt; 0 &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; a&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; b&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:teal;"&gt;Utility&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; T Max&amp;lt;T&amp;gt;(T a, T b)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (a.CompareTo(b) &amp;gt; 0) { &lt;span style="color:blue;"&gt;return&lt;/span&gt; a; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; b;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;OK, it still doesn’t compile. Using CompareTo is a valid solution but it requires that the type assigned to T implement the IComparable interface. You need to indicate this constraint to the C# compiler. This requires one additional code change.&lt;/p&gt;
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; Utility&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Max(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T &lt;span style="color:blue;"&gt;As&lt;/span&gt; IComparable(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)) _&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; a &lt;span style="color:blue;"&gt;As&lt;/span&gt; T, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; b &lt;span style="color:blue;"&gt;As&lt;/span&gt; T)&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; a.CompareTo(b) &amp;gt; 0 &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; a&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; b&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div style="font-size:110%;color:black;font-family:consolas, lucida console, courier new;background-color:#eeeeee;"&gt;&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:teal;"&gt;Utility&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; T Max&amp;lt;T&amp;gt;(T a, T b) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:teal;"&gt;IComparable&lt;/span&gt;&amp;lt;T&amp;gt; &lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (a.CompareTo(b) &amp;gt; 0) { &lt;span style="color:blue;"&gt;return&lt;/span&gt; a; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; b;&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Other common constraints are: requiring a particular base type for the type argument, indicating that the type argument must be a reference type or value type, and indicating that the type argument must have a default constructor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;Generics are better for you than Broccoli (assuming that easier to write, type-safe, performant code is important to you, if not the please do a Google search for Ruby to find material more to your taste). As you work with&amp;nbsp;.NET 2.0 you will begin to get the “Zen of Generics” and then you will see that the immediate benefits of strongly-typed collections are really just the tip of the Iceberg&amp;lt;T&amp;gt; where T : Big, ICold. &lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=466635" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/windsor/archive/tags/Development/default.aspx">Development</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/Article/default.aspx">Article</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/Generics/default.aspx">Generics</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/DevCenter/default.aspx">DevCenter</category><category domain="http://msmvps.com/blogs/windsor/archive/tags/VB/default.aspx">VB</category></item></channel></rss>