Ответ Бена в основном бьет ногтем по голове, но вкратце остановимся на этом:
Проблема здесь в том, что у людей есть естественное ожидание, что универсальный метод будет делать то же самое, что эквивалентный не-общий метод будет делать, если указаны типы во время компиляции.В вашем конкретном случае люди ожидают, что если T короткий, то (int)t
должен поступить правильно - превратить короткое в int.И (double)t
должен превратить короткую позицию в двойную.И если T является байтом, то (int)t
должен превратить байт в целое число, а (double)t
должно превратить байт в двойное число ... и теперь, возможно, вы начинаете видеть проблему.Общий код, который мы должны были бы сгенерировать, в основном должен был бы снова запустить компилятор во время выполнения и выполнить полный анализ типов, а затем динамически сгенерировать код для выполнения преобразования, как и ожидалось .
Это потенциально дорого;мы добавили эту функцию в C # 4, и если вы действительно этого хотите, вы можете пометить объекты как «динамические», и небольшая урезанная версия компилятора снова запустится во время выполнения и выполнит для вас логику преобразования..
Но эта дорогая вещь, как правило, не то, что хотят люди.
Логика "как" далеко менее сложна, чем логика приведения, потому что она не должна иметь делос любыми преобразованиями, кроме преобразования в бокс, распаковку и ссылки.Он не должен иметь дело с определяемыми пользователем преобразованиями, он не должен иметь дело с причудливыми преобразованиями с изменением представления, такими как «удвоение байта», которые превращают однобайтовые структуры данных в восьмибайтовые структуры данных и т. Д.
Вот почему «as» разрешено в общем коде, но приведение не разрешено.
Все это говорит: вы почти наверняка делаете это неправильно.Если вам нужно выполнить проверку типа в универсальном коде , ваш код не является универсальным .Это действительно плохой запах кода.