Вам нужно понять разницу между динамической типизацией и статической типизацией . У индексатора для вашего объекта worksheet
, скорее всего, есть статический тип object
.
public object this[string cell]{get{...}set{...}}
Поскольку все объекты в C # наследуют от типа object
, объект ссылка, хранящаяся в ячейке, может быть ссылкой на любой объект .
То есть, поскольку делегат (например, Func
) является object
, он может быть сохранен в object
ссылке:
Func
И компилятор может понять все это, потому что он неявно понимает, что производный класс может быть сохранен в ссылке на базовый класс.
То, что компилятор не может сделать автоматически, определяет тип динамического типа или тип времени выполнения объекта.
Func
Компилятор не знает, что object
, хранящийся в o
, действительно имеет тип Func
. Это не должно отслеживать это. Это информация, которая должна быть проверена во время выполнения.
func = (Func
Вышеприведенная строка кода компилируется во что-то, что ведет себя аналогично этому:
if(o == null)
func = null;
else if(typeof(Func
Таким образом, любой cast (преобразование из одного типа в другое) можно проверить во время выполнения, чтобы убедиться, что оно действительно и безопасно.
В любом запросе UNION количество столбцов должно быть одинаковым в каждом SELECT, который вы объединяете с UNION. Другими словами, следующее является ошибкой, поскольку число столбцов не одинаково:
SELECT a, b, c FROM table1
UNION
SELECT a, b FROM table1
При выполнении SQL-инъекции вы можете не знать количество столбцов в списке выбора запроса ты эксплуатируешь. Добавьте больше столбцов с NULL по мере необходимости. Просто продолжайте пытаться, пока не получите что-то успешное.
SELECT * FROM drinks WHERE drinkname='smirnoff'
UNION
SELECT COLUMN_NAME, NULL, NULL, NULL, ...
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'drinks'
Это может показаться утомительным и подверженным ошибкам.
Но преступники, которые совершают атаки SQL-инъекций, довольно мотивированы.