Q:

Conversão de char para inteiro no C#

Lendo um artigo de blog, me deparei com a seguinte sintaxe para conversão de char para inteiro:
string value = "123";
foreach (var c in value)
{
    if (char.IsDigit(c))
    {
        int digito = c - '0';
    }
}

Gostaria de saber por que essa conversão funciona.

A:

Todo char é um inteiro correspondente da tabela ASCII, e o '0' é o valor base dessa tabela, ou seja, todos os caracteres tem um valor inteiro correspondente e em uma operação de subtração o resultado é o inteiro correspondente dessa tabela, por isso funciona.
Referencias

char (Referência de C#)
Método Convert.ToInt32 (Char)
How to convert char to int?
Char Struct
Char.GetNumericValue Method (Char)

A:

Segundo a documentação do C#, o char pode ser convertido implicitamente para int

(... ) char pode ser convertida implicitamente para ushort, int, uint, long, ulong, float, double ou  `decimal.

No entanto, cuidado com resultados inesperados. A explicação do @VirgilioNovic justifica porque operações como essa:
char op1 = '3';
char op2 = '1';

Console.WriteLine("Resultado: " + (op1 + op2).ToString());

Não resulta em 4:
`Resultado: 100`

Porque (int)op1 é 51 e (int)op2 é 49.
Veja este exemplo no dotnetfiddle.;

