Я экспериментирую с беглыми методами расширения.
У меня есть следующий простой метод расширения для выполнения безопасного приведения.
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 () - но это не совсем вопрос и код, чтобы гарантировать, что «безопасность» будет просто неясной.
Что касается выразительности, нет value.As<int>()
не более выразителен, чем (int)value
;но почему пользователь метода должен «просто знать», что он работает только со ссылочными типами?Я пытался проработать его в большей степени об ожидаемом поведении метода, чем о выразительной записи.
Фрагмент кода value.As<DateTime>()
, выдает ошибку "Тип 'System.DateTime' должен быть ссылочным типом, чтобыиспользовать его в качестве параметра 'T' в универсальном типе или методе .... Как (объект) ".Из сообщения об ошибке, которое я вижу, разрешается использовать метод top, указанный выше, поскольку он требует ссылочный тип.