как я должен интерпретировать это объявление typedef в c? [Дубликат]

Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.

Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.

Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()

Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line

Ради полноты класса DataContext

public class DataContext : DbContext 
{
    public DbSet Contacts {get; set;}
}

и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.

public partial class Contact 
{
    public string Name {get; set;}
}

Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.

Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.

Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()

33
задан SingleNegationElimination 20 October 2010 в 23:48
поделиться

4 ответа

43
ответ дан Jonathan Leffler 27 August 2018 в 02:30
поделиться

Он вводит тип указателя функции, указывая на функцию, которая ничего не возвращает (void), не принимает никаких параметров и не называет новый тип MCB .

3
ответ дан Jim Brissom 27 August 2018 в 02:30
поделиться

typedef определяет MCB как тип указателя на функцию, которая не принимает никаких аргументов, и возвращает void.

Обратите внимание, что MCB Modes::m_process = NULL; является C ++, а не C. Кроме того, в C, typedef действительно должен быть typedef void (*MCB)(void);.

Я не уверен, что вы подразумеваете под «память была освобождена». У вас есть статический указатель на функцию; функция не может быть освобождена. В лучшем случае ваш указатель был сброшен где-то. Просто отлаживайтесь с памятью на m_process.

4
ответ дан Oliver Charlesworth 27 August 2018 в 02:30
поделиться

Это указатель на функцию. Вы получаете сообщение SEGMENTATION FAULT, потому что пытаетесь сделать вызов функции, адрес которой недействителен (NULL).

В соответствии с вашим конкретным образцом функция не должна возвращать значение (void) и не должен получать никаких параметров ().

Это должно работать:

void a()
{
    printf("Hello!");
}

int main(int arcg, char** argv)
{
    m_process = a;
    m_process(); /* indirect call to "a" function, */
    // Hello!
}

Указатели функций обычно используются для обработки некоторых форм обработки событий в C. Это не единственное его использование, хотя ...

3
ответ дан Pablo Santa Cruz 27 August 2018 в 02:30
поделиться
Другие вопросы по тегам:

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