Есть способ повторно использовать переменную в select new {}? [Дубликат]

Если все остальное не удается, перекомпилируйте.

Недавно я смог избавиться от нерешенной внешней ошибки в Visual Studio 2012, просто перекомпилировав нарушивший файл. Когда я перестроил, ошибка исчезла.

Это обычно происходит, когда две (или более) библиотеки имеют циклическую зависимость. Библиотека A пытается использовать символы в B.lib и библиотеке B пытается использовать символы из A.lib. Ничего не существует для начала. Когда вы пытаетесь скомпилировать A, шаг ссылки завершится неудачно, потому что он не может найти B.lib. A.lib будет сгенерирован, но не будет dll. Затем вы компилируете B, который будет успешным и сгенерирует B.lib. Повторная компиляция A теперь будет работать, потому что теперь найден B.lib.

52
задан Peter Mortensen 7 August 2013 в 23:22
поделиться

4 ответа

var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        let u = t.ComponentType.GetProperty(t.Name)
        where (u != null)
        select u;
79
ответ дан zzzzBov 3 September 2018 в 09:26
поделиться

Вам нужно let:

var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        let name = t.ComponentType.GetProperty(t.Name)
        where (name != null)
        select name;

Если вы хотите сделать это в синтаксисе запроса, вы можете сделать это более эффективным (afaik) и более чистым способом:

var q = TypeDescriptor
            .GetProperties(instance)
            .Select(t => t.ComponentType.GetProperty(t.Name))
            .Where(name => name != null);
85
ответ дан Daniel Hilgarth 3 September 2018 в 09:26
поделиться

Да, используя ключевое слово let:

var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
    let nameProperty = t.ComponentType.GetProperty(t.Name)
    where (nameProperty != null)
    select nameProperty;
14
ответ дан Matten 3 September 2018 в 09:26
поделиться

Существует альтернатива, о которой мало кто знает (select a into b):

var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        select t.ComponentType.GetProperty(t.Name) into u
        where u != null
        select u;

Это означает:

var q = TypeDescriptor.GetProperties(instance)
        .Select(t => t.ComponentType.GetProperty(t.Name))
        .Where(prop => prop != null);

В то время как версия let переводит на:

var q = TypeDescriptor.GetProperties(instance)
        .Select(t => new { t, prop = t.ComponentType.GetProperty(t.Name) })
        .Where(x => x.prop != null)
        .Select(x => x.prop);

Необязательное выделение на элемент, потому что t все еще находится в области видимости (пока не используется). Компилятор C # должен просто оптимизировать это, но это не так (или спецификация языка не позволяет, не уверен).

7
ответ дан usr 3 September 2018 в 09:26
поделиться
Другие вопросы по тегам:

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