C# и CLR имеют несколько различные правила преобразования.
Вы не можете непосредственно бросок между int[]
и uint[]
в C#, потому что язык не полагает, что любое преобразование доступно. Однако, если Вы идете через object
, результат до CLI. От раздела спецификации CLI 8.7 (я надеюсь - я заключаю в кавычки переписка, которую я имел по этой теме с Eric Lippert только что):
и неподписанные интегральные типы примитивов Со знаком могут быть присвоены друг другу; например, int8: = uint8 допустим. С этой целью bool нужно считать совместимым с
uint8
и наоборот, который делаетbool := uint8
допустимый, и наоборот. Это также верно для массивов и неподписанных интегральных типов примитивов со знаком того же размера; например,int32[] := uint32[]
допустимо.
(я не проверил, но я предполагаю, что этот вид преобразования ссылочного типа, являющегося допустимым, - то, что делает is
, возвращают true также.)
несколько неудачно, что существуют разъединения между языком и базовым механизмом выполнения, но это в значительной степени неизбежно в конечном счете, я подозреваю. Существует несколько других случаев как это, но хорошие новости - то, что они редко, кажется, наносят значительный ущерб.
РЕДАКТИРОВАНИЕ: Поскольку Marc удалил свой ответ, я связался с полной почтой от Eric, как отправлено на группу новостей C#.
Вы добавляли префикс тега в web.config?
<pages>
<controls>
<add tagPrefix="CustomControls" namespace="MyApp.CustomControls" ...