Агрегат: семя с нулевым значением [дубликат]

Вот метод, который рекурсивно заменяет все скрипты исполняемыми:

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]);
8
задан Gishu 10 April 2011 в 16:56
поделиться

5 ответов

Рассмотрим следующий метод:

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);
}
10
ответ дан jason 18 August 2018 в 15:30
поделиться

Поскольку вы не можете сделать именно то, что вы хотите сделать, как насчет определения перегруженного метода EqualTo(object)? Это должно позволить ваш необходимый синтаксис.

2
ответ дан Andrew Barber 18 August 2018 в 15:30
поделиться

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

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 не будет компилироваться.

2
ответ дан Eamon Nerbonne 18 August 2018 в 15:30
поделиться

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

0
ответ дан M.A. Hanin 18 August 2018 в 15:30
поделиться

Невозможно без явного указания Т или выполнения броска. Generics - это компиляционные конструкции времени, и поэтому, если компилятор не может определить тип во время компиляции, он не будет компилироваться (как вы видите).

2
ответ дан Vadim 18 August 2018 в 15:30
поделиться
Другие вопросы по тегам:

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