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