LINQ2SQL: как объявить переменную-член типа var?

У меня есть такой класс

    public class foo
    {

        private void getThread()
        {
         var AllThreads = from sc in db.ScreenCycles
                          join s in db.Screens on sc.ScreenID equals s.ScreenID
                          select s;
        }
    }

Я хочу сделать переменную AllThreads переменной класса вместо переменной метода. Нравится...

public class foo
{
    var AllThreads;
    private void getThread()
    {
       AllThreads = from sc in db.ScreenCycles
                          join s in db.Screens on sc.ScreenID equals s.ScreenID
                          select s;
    }
}

Как бы то ни было, я не могу объявить переменную класса типа var.

Как мне этого добиться?


person ctrlShiftBryan    schedule 08.05.2009    source источник
comment
Не существует такой вещи, как тип var, потому что var на самом деле не является типом - это ключевое слово, которое сообщает компилятору: «Вы выясняете, какой тип здесь поместить, потому что у меня есть дела поважнее».   -  person Joel Mueller    schedule 09.05.2009


Ответы (8)


Чтобы сохранить исходный код, попробуйте это

public class foo

    IEnumerable<ScreenCycles> AllThreads;
    private void getThread()
    {
       AllThreads = from sc in db.ScreenCycles
                          join s in db.Screens on sc.ScreenID equals s.ScreenID
                          select s;
    }

}
person Michael La Voie    schedule 08.05.2009
comment
Похоже, он выбирает Screens, а не ScreenCycles - person Joel Coehoorn; 09.05.2009
comment
Стоит ли указывать на то, что исходный дизайн класса ошибочен и обычно не следует возвращать IEnumerable? Конечно, именно то, что вы ответили, действительно на заданный вопрос, но, в конце концов, совет в корне ошибочен (как прямой результат вопроса). - person Serapth; 09.05.2009
comment
Я не мог больше не согласиться. Как правило, вам СЛЕДУЕТ возвращать IEnumerable, если у вас нет веских причин для возврата менее универсального типа. Однако хранение IEnumerable, который зависит от активного соединения с базой данных, без предварительного вызова ToArray или ToList, вероятно, не такая уж хорошая идея. - person Joel Mueller; 09.05.2009

Сделать это можно так:

public class foo {    
  IEnumerable<string> AllThreads;    

  private void getThread() {
     AllThreads = (from sc in db.ScreenCycles
                      join s in db.Screens on sc.ScreenID equals s.ScreenID
                      select s.Screen1 + " " + sc.Thread);
  }
}

Обновлено по предложению Джоэла.

person Jimmie R. Houts    schedule 08.05.2009
comment
Близко, но лучше избегать .ToList (). - person Joel Coehoorn; 09.05.2009
comment
Кроме того, я не думаю, что он возвращает струны. - person Joel Coehoorn; 09.05.2009
comment
ах, он изменил вопрос ... иначе я бы поступил так же, как @ The Lame Duck - person Jimmie R. Houts; 09.05.2009


var может использоваться только как локальное объявление. Если вы хотите использовать тип, возвращаемый из выражения LINQ, вы должны создать объект.

person Jeremy    schedule 08.05.2009

Начальная переменная определяет анонимный класс. Чтобы делать то, что вам нужно, нужно определить класс.

Но ... вы, вероятно, могли бы просто сделать это:

List<string> AllThreads;
person Chris Brandsma    schedule 08.05.2009

Вы не можете использовать var на уровне класса. Вам необходимо указать явный тип, если он не будет сразу инициализирован.

Предполагая, что "s" имеет имя типа "Screen":

public class foo
{
    IEnumerable<Screen> AllThreads;
    private void getThread()
    {
       AllThreads = from sc in db.ScreenCycles
                          join s in db.Screens on sc.ScreenID equals s.ScreenID
                          select s;
    }
}
person Joel Coehoorn    schedule 08.05.2009

Как многие уже говорили, вы не можете использовать var. Выполните рефакторинг вашего кода, чтобы использовать типы Linq.

public class foo 
{
    ScreenCycle[] allThreads;
    private void getThread() 
    { 
        allThreads = (from sc in db.ScreenCycles join s in db.Screens on sc.ScreenID 
                     equals s.ScreenID select s).ToArray(); 
    } 
}
person Serapth    schedule 08.05.2009

Хорошо, это не ответ, просто относительный новичок в вопросе stackoverflow, который этот поток хорошо иллюстрирует.

Инструменты разметки кода на этом сайте серьезно ... гм, уникальны. В данном конкретном случае я не понимаю, почему все наши кодовые блоки комментариев очень длинные? Это то, что сделала ОП? Я устал от различных правок в моем предыдущем примере, и по какой-то причине текстовое поле, в котором находился мой код, было намного длиннее, чем его содержимое. (IE 8)

person Serapth    schedule 08.05.2009