То, почему делает “интервал [], является uint [] == верный” в C#

Названия таблиц и столбцов не могут быть заменены параметрами в PDO.

В этом случае вы просто захотите фильтровать и дезинфицировать данные вручную. Один из способов сделать это - передать сокращенные параметры функции, которая будет выполнять запрос динамически, а затем использовать оператор switch() для создания белого списка допустимых значений, которые будут использоваться для имени таблицы или имени столбца. Таким образом, пользовательский ввод никогда не попадает непосредственно в запрос. Например:

function buildQuery( $get_var ) 
{
    switch($get_var)
    {
        case 1:
            $tbl = 'users';
            break;
    }

    $sql = "SELECT * FROM $tbl";
}

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

34
задан Peervm 27 February 2009 в 06:27
поделиться

5 ответов

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#.

35
ответ дан Jon Skeet 11 October 2019 в 07:10
поделиться

Теперь это интересно. Я нашел это в стандарте ECMA-335. 4.3 castclass. Обратите внимание что:

  • Массивы наследовались Системе. Массив.

  • , Если Foo может быть брошен к Панели, то Foo [] может быть брошен к Панели [].

  • В целях примечания 2 выше, перечисления рассматривают как их базовый тип: таким образом E1 [] может быть брошен к E2 [], если E1 и E2 совместно используют базовый тип.

можно бросить интервал к uint, но что он ведет себя как это, является очень странным. Visual Studio не распознает ни одного из этого, даже часы, когда отладчик присоединяется просто, показывают вопросительный знак'?'.

Вы могли бы хотеть смотреть на это , ускоренная перемотка вперед приблизительно 10 минут в и слушать Anders, объясняет ковариантная реализация массива. Я думаю, что это - существенно базовая проблема здесь.

4
ответ дан John Leidegren 11 October 2019 в 07:10
поделиться

Предложение:

Объявление intArray как "интервал [] intArray" скорее тогда "возражает, что intArray" позволит компилятору забирать недопустимый бросок C#. Если Вы абсолютно не должны использовать объект, я проявил бы тот подход.

Q2 Ре, Q3:

Во времени выполнения Вы попытались перенестись, бросок в проверил блок?

От этой статьи в MSDN:

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

...

По умолчанию, эти непостоянные выражения не проверяются на переполнение во время выполнения также, и они не повышают водосливные исключения. Предыдущий пример отображается-2 147 483 639 как сумма двух положительных целых чисел.

Проверка переполнения может быть включена параметрами компилятора, настройкой среды или использованием проверенного ключевого слова.

, Как это говорит, можно осуществить проверку переполнения более глобально через конфигурацию среды или параметр компилятора.

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

[Обновление] После тестирования этого кода, я нашел, что использование объявления текстового объекта вместо интервала [], кажется, обходит стандартный C#, бросая sytax, независимо от того, включен ли проверенный или нет.

, Поскольку JS заявила при использовании объекта Вы связываетесь правилами CLI, и они, по-видимому, позволяют этому происходить.

Q1 Ре:

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

От MSDN:

выражение, оценивает к истинному, если обеспеченное выражение является непустым, и обеспеченный объект может быть брошен к обеспеченному типу, не заставляя исключение быть брошенным.

1
ответ дан Ash 11 October 2019 в 07:10
поделиться

Я предполагаю назад compatablility с.NET 1: я все еще немного нечеток о деталях, но я полагаю, что типом CLR всех массивов является просто Система. Массив, с дополнительными свойствами Type к поиску тип элемента. вероятно, просто не составлял это в CLR v1 и теперь должен поддержать это.

Это не работающий в (uint[])(new int[]{}) случай происходит, вероятно, из-за компилятора C# (не время выполнения CLR) способность сделать более строгий typechecking.

кроме того, массивы являются просто типом, небезопасным в целом:

Animal[] tigers = new Tiger[10];
tigers[3] = new Elephant(); // ArrayTypeMismatchException
0
ответ дан Simon Buchan 11 October 2019 в 07:10
поделиться

Хорошо,

я пытаюсь попробовать это.

Прежде всего, в документации говорится, "Проверки, если объект совместим с данным типом". Это также говорит, что, ЕСЛИ тип слева "castable" (можно преобразовать без исключения) к типу справа, и выражение оценивает к непустому указателю, ключевое слово, оценит к true.

Смотрят на Jon Skeet для другого ответа. Он сказал это более красноречиво, чем я мог. Он прав, если преобразование будет доступно, то оно примет Ваш синтаксис, Вы могли бы впоследствии записать свое собственное, но это будет казаться излишеством в этой ситуации.

Ссылка: http://msdn.microsoft.com/en-us/library/scekt9xw (По сравнению с 80) .aspx

0
ответ дан Chris 11 October 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: