NullReferenceException при тестировании (m == nullptr) с типом Mathnet Matrix - PullRequest
0 голосов
/ 20 октября 2011

Я борюсь со странным исключением 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.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 Ответ

1 голос
/ 20 октября 2011

Это возможно в C #, по крайней мере, для оператора ==, который будет реализован способом, который выбрасывает нулевую ссылку.

Можете ли вы попробовать вызвать Object :: ReferenceEquals (obj, null) и посмотреть, работает это или нет?

...