то, как корректироваться, “является типом, но используется как переменная”?

В других ответах этот вопрос уже описан более четко, но для полноты изложения здесь используется подход x-macro, если вы хотите пойти по этому пути и рискнуть яростью своего коллеги.

X-макросы - это форма генерации кода, использующая встроенный препроцессор Си. Цель состоит в том, чтобы свести повторение к минимуму, хотя и с некоторыми недостатками:

  1. Исходный файл, который генерирует перечисления и структуры с использованием препроцессора, может показаться сложным, если вы к ним не привыкли.
  2. По сравнению с внешним сценарием сборки, который генерирует исходные файлы, с x-макросами вы никогда не увидите, как сгенерированный код выглядит во время компиляции, если вы не используете настройку компилятора и не проверяете предварительно обработанный файл вручную.
  3. Поскольку вы не видите предварительно обработанные выходные данные, вы не можете использовать отладчик для пошагового выполнения сгенерированного кода так же, как и с кодом, сгенерированным внешним сценарием.

Вы начинаете с создания списка вызовов макро в отдельном файле, например, elements.inc, не определяя, что на самом деле делает макрос в этот момент:

// elements.inc

// each row passes a set of parameters to the macro,
// although at this point we haven't defined what the
// macro will output

XMACRO(TOTO, 18, French)
XMACRO(TITI, 27, English)
XMACRO(TATA, 45, Spanish)

И затем вы определяете макрос каждый раз, когда вам нужно включить этот список, чтобы каждый вызов отображался в одной строке конструкция, которую вы хотите создать - и вы обычно повторяете это несколько раз подряд, т.е.

// concatenate id with "_IND" to create enums, ignore code and description
// (notice how you don't need to use all parameters each time)
// e.g. XMACRO(TOTO, 18, French) => TOTO_IND,
#define XMACRO(id, code, description) id ## _IND,
typedef enum
{
#    include "elements.inc"
     ELEMENTS_COUNT
}
Elements;
#undef XMACRO

// create struct entries
// e.g. XMACRO(TOTO, 18, French) => [TOTO_IND] = { "TOTO", 18, "French" },
#define XMACRO(id, code, description) [id ## _IND] = { #id, code, #description },
const MyElements elems[] = {
{
#    include "elements.inc"
};
#undef XMACRO

Что будет предварительно обработано во что-то вроде:

typedef enum
{
    TOTO_IND,
    TITI_IND,
    TATA_IND,
    ELEMENTS_COUNT
}
Elements;

const MyElements elems[] = {
{
    [TOTO_IND] = { "TOTO", 18, "French" },
    [TITI_IND] = { "TITI", 27, "English" },
    [TATA_IND] = { "TATA", 45, "Spanish" },
};

Очевидно, что частое обслуживание списка становится проще, за счет того, что генерирующий код становится более запутанным.

12
задан Joe Kennedy 4 May 2015 в 17:59
поделиться

4 ответа

Проблема в строке

List<Customer> li = List<Customer>();

, вам нужно добавить «новый»

List<Customer> li = new List<Customer>();

Дополнительно для следующей строки должно быть:

li.Add(new Customer{Name="yusuf", SurName="karatoprak", Number="123456"});

EDIT: Если вы используете VS2005 , то вам нужно создать новый конструктор, который принимает 3 параметра.

public Customer(string name, string surname, string number)
{
     this.name = name;
     this.surname = surname;
     this.number = number;
}
32
ответ дан 2 December 2019 в 03:54
поделиться

Это

List<Customer> li = List<Customer>();

должно быть:

List<Customer> li = new List<Customer>();

, и вам нужно создать конструктор Customer, который принимает 3 аргумента, которые вы хотите передать. Конструктор Customer по умолчанию не принимает аргументов.

4
ответ дан 2 December 2019 в 03:54
поделиться

To answer your second question:

You either need to create a constructor that takes the three arguments:

public Customer(string a_name, string a_surname, string a_number)
{
     Name = a_name;
     SurName = a_surname;
     Number = a_number;
}

or set the values after the object has been created:

Customer customer = new Customer();
customer.Name = "yusuf";
customer.SurName = "karatoprak";
customer.Number = "123456";
li.Add(customer);
2
ответ дан 2 December 2019 в 03:54
поделиться

Поскольку все свойства в классе Customer имеют общедоступные сеттеры, у вас совершенно нет для создания конструктора (как предлагали многие). У вас также есть альтернатива - использовать конструктор без параметров по умолчанию и установить свойства объекта:

Customer c = new Customer();
c.Name = "yusuf";
c.SurName = "karatoprak";
c.Number = "123456";
li.Add(c);
0
ответ дан 2 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

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