Параметр Cast T в универсальном методе DateTime

У меня есть следующий (упрощенный) метод:

private static string GetStringFromValue<T>(T val)
{
    if (typeof(T) == typeof(DateTime))
    {
        return string.Format("{0}", ((DateTime)val).Year.ToString("0000"));
    }
    return string.Empty;
}

В литье "(DateTime) val" Я получаю следующую ошибку:

Нельзя выразить выражение типа 'T' для ввода 'DateTime'

Что я могу сделать для доступа к свойству Year параметра DateTime?

ОБНОВЛЕНИЕ: Благодарим вас за все ваши быстрые ответы. Этот метод (и имя метода) действительно (!) Упрощен, чтобы точно показать мою проблему и позволить всем просто скопировать и вставить его в свою собственную визуальную студию. Просто я хотел добавить некоторые конкретные значения типа, если тип DateTime. Кроме того, 99% метода одинаково.

Ответы

Ответ 1

Измените его на

    return string.Format("{0:yyyy}", val);

Чтобы ответить на вопрос, компилятор не понимает, что T есть DateTime.
Чтобы выполнить этот отбор, вам нужно выполнить object, например:

    return ((DateTime)(object)val).Year.ToString("0000");

Ответ 2

Я знаю, что вы сказали, что пример был упрощен, но подумайте над этим:

private static string GetStringFromValue(DateTime val) 
{ 
    return string.Format("{0}", val.Year.ToString("0000")); 
} 

private static string GetStringFromValue<T>(T val) 
{ 
    return string.Empty; 
} 

Перегрузка DateTime является наилучшим совпадением, когда передается фактическое DateTime, а общая версия будет использоваться для чего-то еще. (Вы даже можете отказаться от общего для второго и просто использовать Object)

Ответ 3

SLaks быстрее, чем я.:)

Но позвольте мне добавить: вы можете подумать о своей реализации, здесь, в зависимости от того, чего вы пытаетесь достичь. Я предполагаю, что причиной того, что общий метод GetStringFromValue должен испускать определенные строки из разных типов. Но это будет немного беспорядком, если у вас есть, скажем, дюжина различных типов.

Если они являются системными типами, такими как DateTime, string.Format(), вероятно, может обрабатывать все из них с соответствующими строками формата. Если они являются вашими собственными типами, рассмотрите возможность переопределения их методов ToString().

В любом случае, более подробная информация о проблеме, которую вы решаете, сделает интересными ответы.