Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Foreach 对象引用未设置为对象c++/cli_Foreach_C++ Cli - Fatal编程技术网

Foreach 对象引用未设置为对象c++/cli

Foreach 对象引用未设置为对象c++/cli,foreach,c++-cli,Foreach,C++ Cli,我不断得到“System.NullReferenceException”和“附加信息:对象引用未设置为对象的实例”。在前一个语句中,我对每个语句大括号执行了完全相同的操作,并且没有抛出错误。有人能解释一下为什么,因为我不明白 array<System::Byte ^> ^temp_2 = gcnew array<System::Byte ^>(4); System::Int32 count_1 = 0; for each (System::Byte ^element

我不断得到“System.NullReferenceException”和“附加信息:对象引用未设置为对象的实例”。在前一个语句中,我对每个语句大括号执行了完全相同的操作,并且没有抛出错误。有人能解释一下为什么,因为我不明白

array<System::Byte ^> ^temp_2 = gcnew array<System::Byte  ^>(4);
System::Int32 count_1 = 0;

for each (System::Byte ^element in temp_2) 
{
    count_1 += 1;
    element = gcnew System::Byte;
    element = System::Byte::Parse(count_1.System::Int32::ToString());
    System::Console::WriteLine(element->System::Byte::ToString());
};

count_1 = 0;
for each (System::Byte ^element in temp_2) 
{
    count_1 += 1;
    System::Console::WriteLine(element->System::Byte::ToString()); *// throws error here//*
};
数组^temp_2=gc新数组(4);
系统::Int32计数_1=0;
对于每个(temp_2中的System::Byte^元素)
{
计数_1+=1;
元素=新系统::字节;
element=System::Byte::Parse(count_1.System::Int32::ToString());
System::Console::WriteLine(元素->系统::字节::ToString());
};
计数_1=0;
对于每个(temp_2中的System::Byte^元素)
{
计数_1+=1;
System::Console::WriteLine(元素->System::Byte::ToString());*//在此处抛出错误//*
};
更改

element->System::Byte::ToString() 

ToString不是一个静态函数。它是类System::Object的成员函数,相应地由System::Byte继承

我对C++/CLI不太了解,但据我所知,如果要更改容器的元素,应该使用普通for循环。 尝试改变

for each (System::Byte ^element in temp_2) 
{
count_1 += 1;
element = gcnew System::Byte;
element = System::Byte::Parse(count_1.System::Int32::ToString());
System::Console::WriteLine(element->System::Byte::ToString());
};

for(int i=0;iToString());
}

您将每个语句的结尾加上了分号,在本例中不应使用分号

编辑:删除了错误的语句

“在你的帖子中,当我格式化它时,我注意到你为每个都称它为
,而不是为每个
,”

事实上,
数组
导致将跟踪句柄放在数组中,而不是数组的句柄,Vlad和我的评论已经很好地涵盖了这一点

然而,与Vlad的结论相反,可以对每个使用
,来变异数组的元素。这项工作(在VS2010中测试):

//cppcli\u foreach\u reference.cpp:主项目文件。
#include“stdint.h”//System::Byte是一个很好的短名称uint8\t
使用名称空间系统;
int main(数组^args)
{
数组^temp_2=gc新数组(4);
uint32计数=0;
对于每个(温度2中的8%元素)
{
计数_1+=1;
元素=系统::字节::解析(L“43”);
System::Console::WriteLine(element.System::Byte::ToString());
}
计数_1=0;
对于每个(温度2中的uint8\t元件)
{
计数_1+=1;
System::Console::WriteLine(element.System::Byte::ToString());
}
返回0;
}
它的工作方式是将跟踪引用绑定到每个数组元素。通过跟踪引用更新,就像本地C++引用,实际上会影响原始对象。与将指针放入数组不同,这实际上是数组中的指针(语法糖)

但是,请注意,这仅适用于阵列。其他集合类型不提供对集合实际内容的访问,它们提供一个索引器属性,该属性具有一个返回值副本的getter和一个将新值复制到内容的setter。以及从
IEnumerator.Current
返回副本的枚举数


只有数组,它是绕过IEnumerator的每个
的的的一个特例,可以在中对每个

进行更新,我将来会使用它来迭代我的数组,因为每个in对对象都做了一些奇怪的事情。谢谢。@user3246323,因为每个都没有做任何奇怪的事情,您只是从未将对字节的引用保存到数组中。您会注意到,在第一个循环中,您根本不使用数组外的元素:您只需分配给引用。这不会更新数组以获得该引用。因此,数组继续保留空引用。for each不允许更改容器的元素。@matt smith能否像我尝试的那样,使用for each in为我提供一个正确的版本,这将帮助我了解它。非常感谢。@matt smith无所谓,刷新页面看到Vlad评论,谢谢大家的帮助。
Byte^
是错误的做法<代码>系统::字节是一种值类型,我保证您不想使用跟踪句柄。您的
元素
不是对数组成员的引用,而是数组元素的副本(该元素又是引用)。当您更改
元素
时,您正在更改副本以引用某个新对象,但您没有更改数组。抛开所有的
字节^
,只使用
数组
@ben voigt,这样您就只使用顶层^来表示CLI中的引用类型了吗?当你说“它是一个元素的副本”时,你说它是指向数组中元素所指向的同一事物的指针。撇开引用/指针术语之间的差异不谈(即,将其视为同一事物)。是的,它是数组元素指向的同一装箱字节的句柄。但实际上您并没有更改指向的字节(在数组中可见),而是重新放置句柄以指向另一个装箱字节。@ben voigt,因此在更正版本的代码之后,我有以下内容。
对于每个(temp_2中的System::byte元素){element=System::byte::Parse(“23”)我试图取消对指针的引用,并将数组中的所有字节设置为23。数组的值没有更改。我是否错误地取消引用指针以修改字节数组中的值。延迟指针
元素的正确版本将非常有用。请尝试对每个元素(temp_2中的System::Byte%元素)添加
不要将%添加到数组类型中,只对每个元素添加%,分号是无害的。风格不好,但不会造成任何问题。谢谢你,我非常感谢你的解释。没有这个我哪儿也去不了
for each (System::Byte ^element in temp_2) 
{
count_1 += 1;
element = gcnew System::Byte;
element = System::Byte::Parse(count_1.System::Int32::ToString());
System::Console::WriteLine(element->System::Byte::ToString());
};
for ( int i = 0; i < temp_2.Length; i++ ) 
{
count_1 += 1;
temp_2[i] = gcnew System::Byte;
temp_2[i] = System::Byte::Parse(count_1.System::Int32::ToString());
System::Console::WriteLine(temp_2[i]->ToString());
}
// cppcli_foreach_reference.cpp : main project file.

#include "stdint.h" // gives System::Byte the nice short name uint8_t

using namespace System;

int main(array<System::String ^> ^args)
{
    array<uint8_t> ^temp_2 = gcnew array<uint8_t>(4);
    uint32_t count_1 = 0;

    for each (uint8_t% element in temp_2) 
    {
        count_1 += 1;
        element = System::Byte::Parse(L"43");
        System::Console::WriteLine(element.System::Byte::ToString());
    }

    count_1 = 0;
    for each (uint8_t element in temp_2) 
    {
        count_1 += 1;
        System::Console::WriteLine(element.System::Byte::ToString());
    }
    return 0;
}