Я экспериментирую с плавными методами расширения.
У меня есть следующий простой метод расширения, чтобы выполнить безопасное приведение.
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 »в универсальном типе или методе .... Как (объект) ". Из сообщения об ошибке я вижу, что он решает использовать верхний метод, указанный выше, поскольку он требует ссылочного типа.