teranex weblog - c#https://budts.be/2010-12-18T12:31:00+01:00Implicit conversions in C#2009-03-25T18:51:00+01:002010-12-18T12:31:00+01:00Jeroen Budtstag:budts.be,2009-03-25:/weblog/2009/03/implicit-conversions-in-c<p>Yesterday I came across an interesting article: <a href="http://journal.stuffwithstuff.com/2008/04/08/whats-the-opposite-of-nullable/">What's the opposite of Nullable</a>. While the solution for Non-Nullability is interesting, the reason i'm blogging this is because the article also used a C# feature which i didn't know of: implicit conversions.</p>
<p>And guess what? Today I had a situation where I could use these implicit conversions. My app reads data from a CSV-file, so all the input are just strings. Until now that was just fine. However, at one part of my code I had to process one of the fields which has a fixed format. Say a field is a phonenumber and i need the country-prefix. So I created a PhoneNumber-class like this:</p>
<div class="highlight"><pre><span></span><span class="k">public</span> <span class="k">class</span> <span class="nc">PhoneNumber</span>
<span class="p">{</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="kt">string</span> <span class="n">_number</span><span class="p">;</span>
<span class="k">public</span> <span class="nf">PhoneNumber</span><span class="p">(</span><span class="kt">string</span> <span class="n">number</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(!</span><span class="k">new</span> <span class="n">Regex</span><span class="p">(</span><span class="n">PHONE_NUMBER_REGEX</span><span class="p">).</span><span class="n">IsMatch</span><span class="p">(</span><span class="n">number</span><span class="p">))</span>
<span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentException</span><span class="p">(</span><span class="s">"Invalid phone number"</span><span class="p">,</span> <span class="s">"number"</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">_number</span> <span class="p">=</span> <span class="n">number</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Prefix</span>
<span class="p">{</span>
<span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">GetPrefixFromNumber</span><span class="p">(...);</span> <span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Now it is possible to create a (helper-)method in another class to get the prefix like this (this is just a simple example):</p>
<div class="highlight"><pre><span></span><span class="k">public …</span></pre></div><p>Yesterday I came across an interesting article: <a href="http://journal.stuffwithstuff.com/2008/04/08/whats-the-opposite-of-nullable/">What's the opposite of Nullable</a>. While the solution for Non-Nullability is interesting, the reason i'm blogging this is because the article also used a C# feature which i didn't know of: implicit conversions.</p>
<p>And guess what? Today I had a situation where I could use these implicit conversions. My app reads data from a CSV-file, so all the input are just strings. Until now that was just fine. However, at one part of my code I had to process one of the fields which has a fixed format. Say a field is a phonenumber and i need the country-prefix. So I created a PhoneNumber-class like this:</p>
<div class="highlight"><pre><span></span><span class="k">public</span> <span class="k">class</span> <span class="nc">PhoneNumber</span>
<span class="p">{</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="kt">string</span> <span class="n">_number</span><span class="p">;</span>
<span class="k">public</span> <span class="nf">PhoneNumber</span><span class="p">(</span><span class="kt">string</span> <span class="n">number</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(!</span><span class="k">new</span> <span class="n">Regex</span><span class="p">(</span><span class="n">PHONE_NUMBER_REGEX</span><span class="p">).</span><span class="n">IsMatch</span><span class="p">(</span><span class="n">number</span><span class="p">))</span>
<span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentException</span><span class="p">(</span><span class="s">"Invalid phone number"</span><span class="p">,</span> <span class="s">"number"</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">_number</span> <span class="p">=</span> <span class="n">number</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Prefix</span>
<span class="p">{</span>
<span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">GetPrefixFromNumber</span><span class="p">(...);</span> <span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Now it is possible to create a (helper-)method in another class to get the prefix like this (this is just a simple example):</p>
<div class="highlight"><pre><span></span><span class="k">public</span> <span class="kt">string</span> <span class="nf">GetPrefix</span><span class="p">(</span><span class="n">PhoneNumber</span> <span class="n">phoneNumber</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">phoneNumber</span><span class="p">.</span><span class="n">Prefix</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>But when you only have the phonenumber as a string, you'll still have to create an instance of PhoneNumber to be able to call the GetPrefix method:</p>
<div class="highlight"><pre><span></span><span class="kt">var</span> <span class="n">prefix</span> <span class="p">=</span> <span class="n">GetPrefix</span><span class="p">(</span><span class="k">new</span> <span class="n">PhoneNumber</span><span class="p">(</span><span class="s">"+32485123456"</span><span class="p">));</span>
</pre></div>
<p>That is, until we add a method for implicit conversion to the PhoneNumber-class:</p>
<div class="highlight"><pre><span></span><span class="k">public</span> <span class="k">class</span> <span class="nc">PhoneNumber</span>
<span class="p">{</span>
<span class="k">private</span> <span class="kt">string</span> <span class="n">_number</span><span class="p">;</span>
<span class="k">public</span> <span class="nf">PhoneNumber</span><span class="p">(</span><span class="kt">string</span> <span class="n">number</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(!</span><span class="k">new</span> <span class="n">Regex</span><span class="p">(</span><span class="n">PHONE_NUMBER_REGEX</span><span class="p">).</span><span class="n">IsMatch</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentException</span><span class="p">(</span><span class="s">"Invalid phone number"</span><span class="p">,</span> <span class="s">"number"</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">_number</span> <span class="p">=</span> <span class="n">number</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Prefix</span>
<span class="p">{</span>
<span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">GetPrefixFromNumber</span><span class="p">(...);</span> <span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">static</span> <span class="k">implicit</span> <span class="k">operator</span> <span class="nf">PhoneNumber</span><span class="p">(</span><span class="kt">string</span> <span class="n">number</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="k">new</span> <span class="nf">PhoneNumber</span><span class="p">(</span><span class="n">number</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Now it is possible to call the GetPrefix method with just a string. The string will be automagically converted to a PhoneNumber, unless it is invalid, in which case the ArgumentException will be thrown:</p>
<div class="highlight"><pre><span></span><span class="kt">var</span> <span class="n">prefix</span> <span class="p">=</span> <span class="n">GetPrefix</span><span class="p">(</span><span class="s">"+32485123456"</span><span class="p">);</span>
</pre></div>