NullReferenceException при тестировании (m == nullptr) с типом Mathnet Matrix
Я борюсь со странным исключением NullReferenceException, которое возникает, когда я пытаюсь сравнить атрибут типа, производного от типа Matrix из библиотеки MathNet, с nullptr.
Я хочу написать библиотеку классов C++/CLI с классом Transformation, производным от MathNet::Numerics::LinearAlgebra::Matrix, который должен представлять позиции в трехмерном пространстве как матрицу 4x4 в однородных координатах. Поскольку я хочу иметь возможность устанавливать позиции относительно других позиций, у меня есть атрибут Transformation^ parent
, От if(parent == nullptr){ ... }
Я хочу проверить, есть ли у текущего Преобразования родитель, но я получаю это Исключение в строке с if(parent == nullptr)
:
An unhandled exception of type 'System.NullReferenceException' occurred in MathNet.Iridium.dll
Additional information: Object reference not set to an instance of an object.
Мой класс Transformation выглядит так:
/// Transformation.h
using namespace MathNet::Numerics::LinearAlgebra;
using namespace System;
ref class Transformation : Matrix
//ref class Transformation : A
{
public:
Transformation(void);
Transformation^ parent;
void DoSomething();
};
/// Transformation.cpp
#include "StdAfx.h"
#include "Transformation.h"
Transformation::Transformation(void) : Matrix(4,4)
{
}
void Transformation::DoSomething()
{
if(parent == nullptr) // Produces NullReferenceException
{
Console::WriteLine("parent is nullptr");
}
Matrix^ m;
if(m == nullptr) // Produces NullReferenceException, too
{
Console::WriteLine("m is nullptr");
}
}
Сравнение любой переменной типа Matrix, которая на самом деле равна нулю, с nullptr, похоже, выдает это исключение. Если он инициализирован должным образом, исключений нет, поэтому это работает нормально:
Matrix^ m = gcnew Matrix(4,4);
if(m == nullptr) // works fine
{
Console::WriteLine("");
}
Когда вывести Преобразование из другого класса, ref class Transformation : A
вместо ref class Transformation : Matrix
все тоже отлично работает.
И теперь это становится действительно странным. Я хотел использовать мою библиотеку классов в C#-приложении. призвание t.DoSomething()
при преобразовании t создает исключение NullReferenceException. НО, если я включаю нулевой тест непосредственно в мое приложение C#, это работает:
Transformation t = new Transformation();
// t.DoSomething(); // Throws NullReferenceException
if (t.parent == null) // OK!
{
Console.WriteLine("parent is null");
}
Если сделать то же самое в приложении C++/ClI снова, выдается исключение NullReferenceException:
Transformation^ t = gcnew Transformation();
// t->DoSomething(); // Throws NullReferenceException
if(t->parent == nullptr) // Throws NullReferenceException
{
Console::WriteLine("parent is nullptr");
}
Любые предложения, откуда это может прийти? Я действительно очень озадачен...
Я использую библиотеку MathNet.Idirium, версия 2008.8.16.470
1 ответ
В C# возможно, по крайней мере, для оператора == быть реализованным способом, который выбрасывает нулевую ссылку.
Можете ли вы попробовать вызвать Object::ReferenceEquals(obj, null) и посмотреть, работает это или нет?