Использование общих ограничений с типами значений

Я экспериментирую с плавными методами расширения.

У меня есть следующий простой метод расширения, чтобы выполнить безопасное приведение.

     public static T As<T>(this Object source)
         where T : class
     {
         return source as T;
     }

Это сработало хорошо, но когда я попытался сделать использование типов значений с перегрузкой интуитивно понятным

     public static T As<T>(this ValueType source)
         where T : struct
     {
         return (T)source;
     }

, я столкнулся с проблемами. Логика разрешения метода всегда выбирает первый метод выше и выдает синтаксическую ошибку (точно), что структура не является классом.

Есть ли способ справиться с вышеизложенным или мне следует пойти по пути удаления ограничения при тестировании и обработке всех типов одним и тем же методом?

==== Изменить: ответить на вопросы ====

Я компилирую это в соответствии с фреймворком 3.5. На самом деле я не пытаюсь достичь чего-то особенного; это просто эксперимент с вышеизложенным. Мой интерес был возбужден, и я собрал код.

Меня не особо беспокоит то, что это останется «безопасным» составом. Вот как он начался, и его можно сохранить в безопасности с помощью default () - но на самом деле это не является основной темой вопроса, и код, обеспечивающий безопасность, просто неясен.

Что касается выразительности, то значение значение. As () не более выразительно, чем значение (int) ; но почему пользователь метода должен «просто знать», что он работает только со ссылочными типами? Моя попытка проработать это была больше связана с ожидаемым поведением метода, чем с выразительным письмом.

Значение фрагмента кода .Как () , выдает ошибку: «Тип System.DateTime должен быть ссылочным типом, чтобы использовать его в качестве параметра« T »в универсальном типе или методе .... Как (объект) ". Из сообщения об ошибке я вижу, что он решает использовать верхний метод, указанный выше, поскольку он требует ссылочного типа.

6
задан Odrade 6 October 2011 в 18:11
поделиться