Второй вариант предпочтительнее, потому что, как все уже говорили, он заставляет код выглядеть и чувствовать себя лучше.
Однако вы можете рассмотреть более архитектурный вариант:
public class TemperatureConverter
{
private static readonly IDictionary<Tuple<string, string>, Func<double, double>> ConverterMap =
new Dictionary<Tuple<string, string>, Func<double, double>>
{
{ Tuple.Create("celsius", "kelvin"), t => t + 273 },
// add similar lines to convert from/to other measurements
}
public static double Convert(double degrees, string fromType, string toType)
{
fromType = fromType.ToLowerInvariant();
toType = toType.ToLowerInvariant();
if (fromType == toType) {
return degrees; // no conversion necessary
}
return ConverterMap[Tuple.Create(fromType, toType)](degrees);
}
}
Использование:
TemperatureConverter.Convert(0, "celcius", "kelvin");
Конечно, это можно еще улучшить (прежде всего на ум приходит использование значений перечисления вместо строк для типов температуры, также необходима некоторая проверка ошибок), но общая идея есть.
ИМХО, это хороший промежуточный подход между мега- switch
в старом школьном стиле и полноценным ОО-подходом (здесь нет реальной необходимости в ОО, поскольку у этой конкретной проблемы преобразования очень простая модель предметной области).