<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Invested Development &#187; C#</title>
	<atom:link href="http://devblog.stuartthompson.net/category/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://devblog.stuartthompson.net</link>
	<description>Thoughtful Approaches to Software Architecture</description>
	<lastBuildDate>Tue, 18 Oct 2011 17:08:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Null-Coalescing Operator</title>
		<link>http://devblog.stuartthompson.net/2007/08/null-coalescing-operator/</link>
		<comments>http://devblog.stuartthompson.net/2007/08/null-coalescing-operator/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 17:46:24 +0000</pubDate>
		<dc:creator>stuartthompson</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[??]]></category>
		<category><![CDATA[Null-Coalescing Operator]]></category>

		<guid isPermaLink="false">http://stuartthompsontech.wordpress.com/?p=40</guid>
		<description><![CDATA[While at a rather disappointing MSDN event yesterday, I came across one gem of C# 3.0 candy in the form of a null-coalescing operator.  This is basically a short-cut for the oft seen: string emailAddress = parsedValue != null ? parsedValue : &#8220;(Not provided)&#8221;; OR string emailAddress = String.Empty; if (parsedValue != null) { emailAddress = [...]]]></description>
			<content:encoded><![CDATA[<p>While at a rather disappointing MSDN event yesterday, I came across one gem of C# 3.0 candy in the form of a null-coalescing operator.  This is basically a short-cut for the oft seen:</p>
<p>string emailAddress = parsedValue != <span style="color:blue;">null</span> ? parsedValue : &#8220;(Not provided)&#8221;;</p>
<p><strong>OR</strong></p>
<p><span style="font-family:Courier,New;">string emailAddress = String.Empty;<br />
if (parsedValue != <span style="color:blue;">null</span>) {<br />
emailAddress = parsedValue;<br />
}<br />
else {<br />
emailAddress = &#8220;(Not provided)&#8221;;<br />
}<br />
</span></p>
<p><strong><span style="text-decoration:underline;">Using the Null-Coalescing Operator</span></strong><br />
These can now instead be re-written using the new null-coalescing operator as:</p>
<p><span style="font-family:Courier,New;"><span style="color:blue;">string</span> emailAddress = parsedValue ?? &#8220;(Not provided)&#8221;;</span></p>
<p>This can roughly be read as &#8220;Set emailAddress equal to parsedValue unless it is null, in which case set it to the literal (Not Provided)&#8221;.</p>
<p><strong><span style="text-decoration:underline;">Applications with Nullable Types</span></strong><br />
This is also very useful with the new nullable types.  For example, when converting an integer to its value type:</p>
<p><span style="font-family:Courier,New;"><span style="color:blue;">int</span>? recordsAffected = <span style="color:blue;">null</span>;<br />
<span style="color:#009900;">&#8230; code that might cause recordsAffected to contain a value &#8230;</span><br />
<span style="color:blue;">int</span> totalRecordsAffected += recordsAffected ?? 0;</span></p>
<p>Here a nullable int type can be added to a regular int without fear of an exception by subsituting 0 in the place of a null value.  It&#8217;s always nice to find new candy!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" class="tt" href="http://twitter.com/home/?status=Null-Coalescing+Operator%3A+http%3A%2F%2Fdevblog.stuartthompson.net%2F%3Fp%3D40" title="Post to Twitter"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://buzz.yahoo.com/buzz?targetUrl=http://devblog.stuartthompson.net/2007/08/null-coalescing-operator/&amp;headline=Null-Coalescing+Operator" title="Post to Yahoo Buzz"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/buzz/tt-buzz-micro3.png" alt="Post to Yahoo Buzz" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://devblog.stuartthompson.net/2007/08/null-coalescing-operator/&amp;title=Null-Coalescing+Operator" title="Post to Delicious"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://devblog.stuartthompson.net/2007/08/null-coalescing-operator/&amp;title=Null-Coalescing+Operator" title="Post to Digg"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/digg/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://devblog.stuartthompson.net/2007/08/null-coalescing-operator/&amp;t=Null-Coalescing+Operator" title="Post to Facebook"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://devblog.stuartthompson.net/2007/08/null-coalescing-operator/&amp;title=Null-Coalescing+Operator" title="Post to Reddit"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/reddit/tt-reddit-micro3.png" alt="Post to Reddit" /></a> <a target="_blank" class="tt" href="http://stumbleupon.com/submit?url=http://devblog.stuartthompson.net/2007/08/null-coalescing-operator/&amp;title=Null-Coalescing+Operator" title="Post to StumbleUpon"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/su/tt-su-micro3.png" alt="Post to StumbleUpon" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://devblog.stuartthompson.net/2007/08/null-coalescing-operator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Anonymous Method Predicates to Search Lists</title>
		<link>http://devblog.stuartthompson.net/2007/08/using-anonymous-method-predicates-to-search-lists/</link>
		<comments>http://devblog.stuartthompson.net/2007/08/using-anonymous-method-predicates-to-search-lists/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 19:15:24 +0000</pubDate>
		<dc:creator>stuartthompson</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Anonymous Methods]]></category>
		<category><![CDATA[Predicates]]></category>
		<category><![CDATA[Search]]></category>

		<guid isPermaLink="false">http://stuartthompsontech.wordpress.com/?p=38</guid>
		<description><![CDATA[I use System.Collections.Generic.List all over the place.  Generics are a couple of years out of date and most people are done with them in terms of cool factor, but that doesn&#8217;t in any way detract from the coolness they add to my life each and every day.  I still eat toast and that&#8217;s been around for ages.  I [...]]]></description>
			<content:encoded><![CDATA[<p>I use System.Collections.Generic.List all over the place.  Generics are a couple of years out of date and most people are done with them in terms of cool factor, but that doesn&#8217;t in any way detract from the coolness they add to my life each and every day.  I still eat toast and that&#8217;s been around for ages.  I answered a question this morning that made me realize that while the generic list class has been generally embraced by most, it perhaps has also been generally muddled by some attempting to keep up with the oft quick pace that is .NET.  I&#8217;ve seen quite a few development shops that stuck around on .NET 1.1 for a long time because of migration concerns and then very quickly &#8220;updated their code&#8221; to embrace .NET 2.0 without really giving people the time to absorb all of the new information.  One of these areas is with collection classes.</p>
<p>When a development shop moves to .NET 2.0, one of the first things you&#8217;ll see is a bunch of {blah}Collection class objects being removed from the codebase and their usage replaced with List throughout.  This is all well and good.  A smaller code surface area is easier to test and maintain, and most people didn&#8217;t ever fully finish building a complete collection class anyway, feeling that the code around finding, searching, comparing, etc&#8230; within the collection classes was always a little muddy.  It&#8217;s true that building a robust collection class is difficult, especially when considering an object model that involves some serious aggregation.</p>
<p>However, we seem to have found a new source for confusion on how to search collections in the adoption of the System.Collections.Generic.List class.  The question I answered this morning about searching a generic list is not the first I have received, so I thought I&#8217;d take the time to share a couple of techniques that I use and get feedback from others on their strategies.  What prompted me to write this article was a small snippet of code I received that looked like this:  (original code modified to protect the innocent)</p>
<p>string targetName = &#8220;Thompson&#8221;;</p>
<p>List myObjectList = new List();<br />
&#8230; list is populated with some items &#8230;</p>
<p>MyObj selectedObject = null;<br />
foreach (MyObj obj in myObjectList)<br />
{<br />
if (obj.Name == targetName)<br />
{<br />
selectedObject = obj;<br />
}<br />
}</p>
<p>The code <em>looks</em> reasonable from a first glance.  The original code was actually copied from within a collection class&#8217; SearchByName() method when the class was being replaced with a System.Collections.Generic.List.  This is scary for a couple of reasons.  First of all, original code contains a couple of bugs that weren&#8217;t addressed as part of the migration probably because very little time was given to &#8220;move to .NET 2.0&#8243;. &amp;nbp;Secondly, this probably isn&#8217;t an isolated case.  I suspect that this kind of refactoring is happening in a lot of other projects.  Let&#8217;s look at the code in a little more detail and think about some of the opportunities for improvement.</p>
<p>The first obvious bug is that if two objects exist in the list with the target name, the last one searched that matches is being set as the selected object.  This shouldn&#8217;t simply be handled by adding a &#8220;return&#8221; within the loop to return the first either (which I&#8217;ve seen in &#8220;fixes&#8221; before).  In this case it is probably important to know that more than one object matched the target name.  While seemingly minor, there is no lock statement around the foreach search, meaning that the list could be modified during the search by code in any thread with a reference to the list.  Wouldn&#8217;t it be nice if there were a way to find an item in a list without having to worry about such things?</p>
<p>The System.Collections.Generic.List class provides Find() and FindAll() methods that take a System.Predicate as a parameter.  Most developers I&#8217;ve watched tend to browse this method in Intellisense, think &#8220;Oh my god, I have no idea what this Predicate class is&#8221; and then code a method similar to the one listed above.  However, the System.Predicate generic really isn&#8217;t all that scary and is actually a really elegant solution to the problem.  Look at the following code for a second:</p>
<p>string targetName = &#8220;Thompson&#8221;;</p>
<p>List myObjectList = new List();<br />
&#8230; list is populated with some items &#8230;</p>
<p>List matches = myObjectList.FindAll(delegate(MyObj compare)<br />
{<br />
return compare.Name == targetName;<br />
});</p>
<p>Here, an anonymous method was used as an implementation of System.Predicate to determine whether the comparison of an object&#8217;s name to the target name was true.  That&#8217;s essentially how predicates work, they assert whether a particular predicate is true or not.  In this case, we are using them to determine whether or not a particular item in a collection matches certain search criteria.  The way that the FindAll() method works is to pass each object in the collection to the specified predicate and add the object to a <em>match</em> list if the predicate is true.  In the one call to FindAll() our code was able to determine all items in the list that have the specified target name.  Also, the Find() and FindAll() method correctly issue a lock statement upon the list to protect the search, as well as other finery around error handling for null objects in the list.  All of this code for free in a single method call.</p>
<p>Anonymous delegates do not have to be used for predicates, although they present the most graceful solution for a parameterized search.  What I mean by this is that if your search does not rely upon a parameter like <em>targetName</em> in the example above, you could pass a delagate implementation to the find method.  The example below shows how a predicate can be used to find items in the list with a name longer than 5 characters:</p>
<p>List myObjectList = new List();<br />
&#8230; list is populated with some items &#8230;</p>
<p>List matches = myObjectList.FindAll(ObjNameLongEnough);</p>
<p>The method ObjNameLongEnough is defined as follows:</p>
<p>private bool ObjNameLongEnough(MyObj compare)<br />
{<br />
return compare.Name.Length &gt; 5;<br />
}</p>
<p>This example gives a better idea of how the anonymous method delegate is working by showing the signature of the System.Predicate that is expected.  Notice that the method signature of ObjNameLongEnough() takes a MyObj parameter.  The FindAll() method simply calls this delegate for each item in the list and adds the object to the match collection if the predicate returns true.  If the desired behavior was to find only the first match in the list, use the Find() method instead.</p>
<p>Astute readers are probably wondering if there is an overloaded version of System.Predicate that takes an additional search parameter.  This would have allowed for the first example that compared to target name to be coded as an actual delegate as opposed to an anonymous method by passing the targetName variable into the search delegate.  However, unfortunately, there is not an overloaded version.  This appears to stem from the computer science root that a predicate is simply a test that something is true of something.  Therefore a predicate cannot be parameterized as it would be testing its trueness(TM) to something in relation to something else.</p>
<p>IMHO anonymous methods are still a great solution to the problem and provide compact, readable code for searching generic list collections without having to worry about the finer points of locking, object null testing, and first match versus all matches.  Enjoy!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" class="tt" href="http://twitter.com/home/?status=Using+Anonymous+Method+Predicates+to+Search+Lists%3A+http%3A%2F%2Fdevblog.stuartthompson.net%2F%3Fp%3D38" title="Post to Twitter"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://buzz.yahoo.com/buzz?targetUrl=http://devblog.stuartthompson.net/2007/08/using-anonymous-method-predicates-to-search-lists/&amp;headline=Using+Anonymous+Method+Predicates+to+Search+Lists" title="Post to Yahoo Buzz"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/buzz/tt-buzz-micro3.png" alt="Post to Yahoo Buzz" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://devblog.stuartthompson.net/2007/08/using-anonymous-method-predicates-to-search-lists/&amp;title=Using+Anonymous+Method+Predicates+to+Search+Lists" title="Post to Delicious"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://devblog.stuartthompson.net/2007/08/using-anonymous-method-predicates-to-search-lists/&amp;title=Using+Anonymous+Method+Predicates+to+Search+Lists" title="Post to Digg"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/digg/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://devblog.stuartthompson.net/2007/08/using-anonymous-method-predicates-to-search-lists/&amp;t=Using+Anonymous+Method+Predicates+to+Search+Lists" title="Post to Facebook"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://devblog.stuartthompson.net/2007/08/using-anonymous-method-predicates-to-search-lists/&amp;title=Using+Anonymous+Method+Predicates+to+Search+Lists" title="Post to Reddit"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/reddit/tt-reddit-micro3.png" alt="Post to Reddit" /></a> <a target="_blank" class="tt" href="http://stumbleupon.com/submit?url=http://devblog.stuartthompson.net/2007/08/using-anonymous-method-predicates-to-search-lists/&amp;title=Using+Anonymous+Method+Predicates+to+Search+Lists" title="Post to StumbleUpon"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/su/tt-su-micro3.png" alt="Post to StumbleUpon" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://devblog.stuartthompson.net/2007/08/using-anonymous-method-predicates-to-search-lists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Overloaded Indexers cause Ambiguous Match</title>
		<link>http://devblog.stuartthompson.net/2007/04/overloaded-indexers-cause-ambiguous-match/</link>
		<comments>http://devblog.stuartthompson.net/2007/04/overloaded-indexers-cause-ambiguous-match/#comments</comments>
		<pubDate>Fri, 13 Apr 2007 12:25:59 +0000</pubDate>
		<dc:creator>stuartthompson</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[indexers]]></category>
		<category><![CDATA[overload]]></category>

		<guid isPermaLink="false">http://stuartthompsontech.wordpress.com/?p=9</guid>
		<description><![CDATA[Developing custom web server controls can be a powerful way to provide opportunity for code re-use while retaining strong design-time support and Visual Studio integration.  This is especially useful when developing a solution that will be handed off to a maintenance team as it allows full control of the rendering and behavior of your control whilst retaining ease [...]]]></description>
			<content:encoded><![CDATA[<div class="itemTitleStyle"><span style="font-size:x-small;">Developing custom web server controls can be a powerful way to provide opportunity for code re-use while retaining strong design-time support and Visual Studio integration.  This is especially useful when developing a solution that will be handed off to a maintenance team as it allows full control of the rendering and behavior of your control whilst retaining ease of use and configuration for the maintenance team at a later date.  One of the common patterns that appears in such server controls is the definition of a child collection of items.  This is akin to the collection property <em>Columns</em> on the <em>System.Web.UI.WebControls.DataGrid</em> control.  When defined in .aspx, it looks like the following: </span></div>
<div class="itemBodyStyle">
<p><span style="font-family:Courier New;">&lt;asp:DataGrid id=&#8221;myGrid&#8221; runat=&#8221;server&#8221;&gt;<br />
&lt;Columns&gt;<br />
&#8230; column definitions &#8230;<br />
&lt;/Columns&gt;<br />
&lt;/asp:DataGrid&gt;</span></p>
<p><span style="font-size:x-small;">This collection is used in the definition of the data-grid to define information about the columns that the control should create when it is rendered.  Similarly, a custom control might have a collection of child items that represent domain objects within your custom solution. </span></p>
<p><span style="font-size:x-small;">I came across an error in one custom server control I developed that manifested itself as an <em>System.Web.HttpParseException</em> with the error message &#8216;Parser error: Ambiguous match found&#8217;.  The collection property, shown as <span style="font-family:Courier New;">&lt;ChildItems&gt;</span> in the code below, was highlighted as the source of the error: </span></p>
<p><span style="font-family:Courier New;">&lt;ctl:CustomControl id=&#8221;myControl&#8221; runat=&#8221;server&#8221;&gt;<br />
<span style="color:#ff0000;">&lt;ChildItems&gt;</span><br />
&#8230; child item definitions &#8230;<br />
&lt;/ChildItems&gt;<br />
&lt;/ctl:CustomControl&gt;</span></p>
<p><span style="font-size:x-small;">After a little bit of research, I found a </span><a href="http://www.stuartthompson.net/Blog/ct.ashx?id=c8c40cef-e730-4bef-864b-05b46224aefb&amp;url=http%3a%2f%2fsupport.microsoft.com%2f%3fkbid%3d823194"><span style="font-size:x-small;">Microsoft KnowledgeBase article (#823194)</span></a><span style="font-size:x-small;"> that seemed to describe the symptoms I was observing.  The article indicated that the problem was in the definition of the custom collection itself.  If the collection contained an overloaded indexer then the ASP.NET framework would raise the HttpParseException and display the observed &#8220;Parser error: Ambiguous match exception&#8221; message when trying to instantiate the control in the page hierarchy. </span></p>
<p><span style="font-size:x-small;">I quickly popped open the code for the collection class and saw that I had indeed added an overloaded indexer as part of a recent update to the control.  I had added the ability to retrieve an item from the collection by item name as it was useful by another control that aggregated the one exhibiting the error.  There was already an indexer defined for the collection that used an <em>integer</em> to retrieve an item from a specified position.  In terms of C# syntax and for other consumers of the class, having an overloaded indexer is perfectly legitimate, however testing revealed that it was indeed the new this[string] indexer that was causing the problem when ASP.NET tried to instantiate the control programatically and deserialize the .aspx definition into that object instance.  After commenting out the indexer and re-running my tests, the problem was gone.  I have since replaced the overloaded indexer with an additional GetBy&#8230;() method and updated the documentation accordingly.  This wasn&#8217;t a particularly tricky bug to track down, but it&#8217;s interesting nonetheless.</span></div>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" class="tt" href="http://twitter.com/home/?status=Overloaded+Indexers+cause+Ambiguous+Match%3A+http%3A%2F%2Fdevblog.stuartthompson.net%2F%3Fp%3D9" title="Post to Twitter"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://buzz.yahoo.com/buzz?targetUrl=http://devblog.stuartthompson.net/2007/04/overloaded-indexers-cause-ambiguous-match/&amp;headline=Overloaded+Indexers+cause+Ambiguous+Match" title="Post to Yahoo Buzz"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/buzz/tt-buzz-micro3.png" alt="Post to Yahoo Buzz" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://devblog.stuartthompson.net/2007/04/overloaded-indexers-cause-ambiguous-match/&amp;title=Overloaded+Indexers+cause+Ambiguous+Match" title="Post to Delicious"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://devblog.stuartthompson.net/2007/04/overloaded-indexers-cause-ambiguous-match/&amp;title=Overloaded+Indexers+cause+Ambiguous+Match" title="Post to Digg"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/digg/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://devblog.stuartthompson.net/2007/04/overloaded-indexers-cause-ambiguous-match/&amp;t=Overloaded+Indexers+cause+Ambiguous+Match" title="Post to Facebook"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://devblog.stuartthompson.net/2007/04/overloaded-indexers-cause-ambiguous-match/&amp;title=Overloaded+Indexers+cause+Ambiguous+Match" title="Post to Reddit"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/reddit/tt-reddit-micro3.png" alt="Post to Reddit" /></a> <a target="_blank" class="tt" href="http://stumbleupon.com/submit?url=http://devblog.stuartthompson.net/2007/04/overloaded-indexers-cause-ambiguous-match/&amp;title=Overloaded+Indexers+cause+Ambiguous+Match" title="Post to StumbleUpon"><img class="nothumb" src="http://devblog.stuartthompson.net/wp-content/plugins/tweet-this/icons/en/su/tt-su-micro3.png" alt="Post to StumbleUpon" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://devblog.stuartthompson.net/2007/04/overloaded-indexers-cause-ambiguous-match/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

