Поделиться через


Предупреждение компилятора (уровень 1) C4691

"type" : тип, на который ссылается тип, ожидался в сборке unreferenced "file", тип, определенный в текущей единице перевода, используемой вместо этого

Файл метаданных, содержащий определение исходного типа, не ссылается, и компилятор использует определение локального типа.

В случае перестроения файла C4691 можно игнорировать или отключить с предупреждением pragma. То есть, если файл, который вы создаете, совпадает с файлом, в котором компилятор ожидает найти определение типа, можно игнорировать C4691.

Однако непредвиденное поведение может возникать, если компилятор использует определение, которое не из той же сборки, на которую ссылается метаданные; Типы СРЕДЫ CLR типируются не только по имени типа, но и сборке. То есть тип Z из сборки z.dll отличается от типа Z от сборки y.dll.

Примеры

Этот пример содержит исходное определение типа.

// C4691_a.cpp
// compile with: /clr /LD /W1
public ref class Original_Type {};

Этот пример ссылается на C4691_a.dll и объявляет поле типа Original_Type.

// C4691_b.cpp
// compile with: /clr /LD
#using "C4691_a.dll"
public ref class Client {
public:
   Original_Type^ ot;
};

Следующий пример приводит к возникновению ошибки C4691. Обратите внимание, что этот пример содержит определение для Original_Type и не ссылается на C4691a.dll.

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

// C4691_c.cpp
// compile with: /clr /LD /W1
// C4691 expected

// Uncomment the following line to resolve.
// #using "C4691_a.dll"
#using "C4691_b.dll"

// Delete the following line to resolve.
ref class Original_Type;

public ref class MyClass : Client {};