Pergunta

Estou lutando com uma estranha NullReferenceException que ocorre quando tento comparar um atributo de um tipo derivado de um tipo Matrix do Biblioteca MathNet para nullptr.

Quero escrever uma biblioteca de classes C ++ / CLI com uma classe Transformation, derivada de MathNet :: Numerics :: LinearAlgebra :: Matrix, que deve representar as posições no espaço 3D como uma matriz 4x4 em coordenadas homogêneas. Porque eu quero ser capaz de definir posições relativas a outras posições, eu tenho um atributo Transformation^ parent. Por if(parent == nullptr){ ... }, desejo testar se a transformação atual tem um pai, mas obtenho esta exceção na linha com 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.

Minha classe de transformação se parece com isto:

/// 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");
    }
}

Comparar qualquer variável do tipo Matrix, que é realmente nula, com nullptr parece lançar esta exceção. Se for inicializado corretamente, não há exceção, então funciona bem:

Matrix^ m = gcnew Matrix(4,4);
if(m == nullptr)        // works fine
{
    Console::WriteLine("");
}

Ao derivar Transformation de uma classe diferente, ref class Transformation : A em vez de ref class Transformation : Matrix, tudo funciona bem também.

E agora fica muito estranho. Eu queria usar minha biblioteca de classes em um aplicativo C #. Chamar t.DoSomething() em uma Transformação t lança a NullReferenceException. MAS, se eu incluir o teste nulo diretamente em meu aplicativo C #, ele funciona:

Transformation t = new Transformation();
// t.DoSomething();      // Throws NullReferenceException
if (t.parent == null)    // OK!
{
    Console.WriteLine("parent is null");
}

Fazer o mesmo em um aplicativo C ++ / ClI novamente gera a NullReferenceException:

Transformation^ t = gcnew Transformation();
// t->DoSomething();     // Throws NullReferenceException
if(t->parent == nullptr) // Throws NullReferenceException
{
    Console::WriteLine("parent is nullptr");
}

Alguma sugestão de onde isso pode vir? Estou realmente muito confuso ...

Eu uso a Biblioteca MathNet.Idirium, Versão 2008.8.16.470

Foi útil?

Solução

É possível em C #, pelo menos, que o operador== seja implementado de uma maneira que lance uma referência nula.

Você pode tentar chamar Object :: ReferenceEquals (obj, null) e ver se funciona ou não?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top