brenoferreira/CSharp.Fun — pull request #1 by rranelli (2014-04-18 03:02:40+00:00)
Title: Substituindo None<T> na interface pública por Option.None

Foi realizada uma modificação na estrutura da ```Option``` para esconder a
'deselegância' do ```None()```.

A ideia para esconder ```None``` é a seguinte. Cria-se uma classe ```Option```, não genérica, e sem construtor público. Essa classe não genérica terá apenas uma instância que irá representar o ```None``` sem tipo, que só pode ser acessada pela propriedade estática ```Option.None```.

Adiciona-se a capacidade de converter ```Option``` em ```None``` implicitamente. Como ```None``` é subtipo de ```Option```, automaticamente essa instância única de ```Option``` pode ser usada em qualquer contexto em que se espera um ```Option```. Essa artimanha simula o conceito do Scala de "Option of Nothing". Estamos simulando o tipo ```Nothing``` com a ausência do type parameter, e fazendo manualmente a conversão de tipos. A conversão de tipos "mágica" acontece aqui:

```c#
public static implicit operator Option (Option option)
{
return new None();
}
```

O compilador consegue criar um operador genérico, me dando acesso ao type parameter. Com isso, fica fácil retornar o exato ````None```` que é necessário para a conversão, sem perder a sanidade da tipagem estatica.

Dessa forma, damos um nó no type system do c# e não precisamos criar os ```None()```, ```None()``` que não fazem sentido.

Um problema é que para implementar a conversão de ```Option``` em ```Option``` tive de mudar ```Option``` de uma interface para uma classe abstrata. Com isso, perdemos a covariância que havia anteriormente.