Вот метод, который рекурсивно заменяет все скрипты исполняемыми:
function nodeScriptReplace(node) {
if ( nodeScriptIs(node) === true ) {
node.parentNode.replaceChild( nodeScriptClone(node) , node );
}
else {
var i = 0;
var children = node.childNodes;
while ( i < children.length ) {
nodeScriptReplace( children[i++] );
}
}
return node;
}
function nodeScriptIs(node) {
return node.tagName === 'SCRIPT';
}
function nodeScriptClone(node){
var script = document.createElement("script");
script.text = node.innerHTML;
for( var i = node.attributes.length-1; i >= 0; i-- ) {
script.setAttribute( node.attributes[i].name, node.attributes[i].value );
}
return script;
}
Пример вызова:
nodeScriptReplace(document.getElementsByTagName("body")[0]);
Рассмотрим следующий метод:
public bool IsNullString<T>(T item) {
return typeof(T) == typeof(string) && item == null;
}
Да, это патетически глупый метод, и использование дженериков здесь бессмысленно, но вы увидите точку за мгновение.
Теперь рассмотрим
bool first = IsNullString<string>(null);
bool second = IsNullString<Foo>(null);
bool third = IsNullString(null);
. В первом и втором компиляторе можно четко различать тип T
(не требуется никакого вывода). В третьем, как компилятор делает вывод о том, что T
? В частности, он не может различать T == string
и T == Foo
или любой другой тип в этом отношении. Поэтому компилятор должен дать вам ошибку времени компиляции.
Если вы хотите обойти это, вам нужно либо бросить null
EqualTo((object)null);
, либо явно указать тип
EqualTo<object>(null)
или определить перегрузку
private static Matcher<object> EqualTo(object item) {
return new IsEqual<object>(item);
}
Поскольку вы не можете сделать именно то, что вы хотите сделать, как насчет определения перегруженного метода EqualTo(object)
? Это должно позволить ваш необходимый синтаксис.
Вы можете обойти это ограничение, используя следующий синтаксис:
EqualTo("abc");
EqualTo(4);
EqualTo(default(object));
//equivalently:
EqualTo((object)null);
default(T)
- это значение, которое имеет поле типа T
, если оно не задано. Для ссылочных типов это null
, для типов значений это по существу память, заполненная нулевыми байтами (... которая может означать разные вещи для разных типов, но обычно означает некоторую версию нуля).
Я пытаюсь во избежание null
везде в моем коде в настоящее время. Это затрудняет вывод типа в другом месте, например, с объявленным полем var
и тройным оператором. Например, myArray==null ? default(int?) : myArray.Length
в порядке, но myArray==null ? null : myArray.Length
не будет компилироваться.
Возможно, реализация неэквивалентного EqualTo, который принимает объект как тип аргумента, решит проблему перезаписи этих строк кода.
Невозможно без явного указания Т или выполнения броска. Generics - это компиляционные конструкции времени, и поэтому, если компилятор не может определить тип во время компиляции, он не будет компилироваться (как вы видите).