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) и посмотреть, работает это или нет?

Другие вопросы по тегам