代码很简单,提示的错误我也明白,但我觉得不应该这样。求解using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Hello_World
{
class Program
{
public static void PrintArray(object[] objArray)
{
foreach (object temObject in objArray)
{
Console.WriteLine(temObject.ToString());
} Console.WriteLine("\n");
} static void Main(string[] args)
{
int[] intArray = new int[5];
PrintArray(intArray);
}
}
}编译的时候提示 无法将 int[] 转换为 object[] 但是objece 不是一切对象的根么?为什么不可以这样用呢?
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Hello_World
{
class Program
{
public static void PrintArray(object[] objArray)
{
foreach (object temObject in objArray)
{
Console.WriteLine(temObject.ToString());
} Console.WriteLine("\n");
} static void Main(string[] args)
{
int[] intArray = new int[5];
PrintArray(intArray);
}
}
}编译的时候提示 无法将 int[] 转换为 object[] 但是objece 不是一切对象的根么?为什么不可以这样用呢?
object[] objArry=new object[3];
Array.Copy(intArray, objArry, 3);
PrintArray(objArry);
{
static void Main(string[] args)
{
PrintCollection(new int[5]);
} static void PrintCollection(IEnumerable collection)
{
foreach (object item in collection)
{
Console.WriteLine(item);
}
}
}
这样写是OK的,但是并不是针对object[]和int[]之间的处理
object[] objArray = (object[])System.Collections.ArrayList.Adapter((Array)intArray ).ToArray(typeof(object));
if ( objArray is Array ) {
foreach ( object temObject in ( objArray as Array ) ) {
Console.WriteLine( temObject.ToString() );
}
} else {
Console.WriteLine( objArray.ToString() );
}
Console.WriteLine( "\n" );
} private void TestMain( ) {
int[] intArray = new int[ 5 ] { 1,2,3,4,5};
PrintArray( intArray );
}
我稍微改了一下代码,如果把 private void PrintArray( object[] objArray )
改为 private void PrintArray( object objArray )这样的话就可行了。
只是还是没有搞清 object[] 和 int[] 之间为什么不能简单地强制转换。
只要将代码稍作改动,即可发现里面的窍门了:
将楼主那代码中的
public static void PrintArray(object[] objArray)
改为
public static void PrintArray(Array objArray)
而 Array 是某种加工过的 object * 1个
同样道理
object[] 也是从Array 来的,也是 object * 1个那样 作为根的那个 object 其实是个怪物了。
只不过它的名称也正好是叫做 object 罢了。
结论就是我们程序员是无法操作它的了?吗~?
(我在怀疑这个结论,但是没有好的理由来解释)
前提:
private void PrintArray( object[] objArray ) {
if ( objArray is Array ) {
foreach ( object temObject in ( objArray as Array ) ) {
Console.WriteLine( temObject.ToString() );
}
} else {
Console.WriteLine( objArray.ToString() );
}
Console.WriteLine( "\n" );
}
调用1:
private void TestMain( ) {
object[] objArray = new object[ 5 ] { "1", "2", "3", "4", "5" };
if ( objArray is Array )
Console.WriteLine( "objArray is Array" );
Array aryObj = objArray;
object[] objTmp = aryObj as object[];
PrintArray( objTmp );
}
结果1:编译和执行都通过了
调用2:
private void TestMain( ) {
object[] objArray = new object[ 5 ] { "1", "2", "3", "4", "5" };
if ( objArray is Array )
Console.WriteLine( "objArray is Array" );
Array aryObj = objArray;
PrintArray( aryObj as object[] );
// 以上的调用通过测试
int[] intArray = new int[ 5 ] { 1, 2, 3, 4, 5 };
Array aryInt = intArray;
if ( aryInt is Array )
Console.WriteLine( "aryInt is Array" );
PrintArray( aryInt as object[] );
}
结果2:编译通过,执行报错:在 Console.WriteLine( objArray.ToString() );
追踪其值:objArray = null
也就是说:aryInt as object[] 没有成功。
究其原因:又回到了 int[] 和 object[] 之间的转换问题了。
(1) C#中不同类型之间的对象,其构成元素相同的可以转化。
(2) null 表示空,对没有实例化的对象引用会报错(不只是在这个环境中)。
表示该数组中的每个元素是object类型,可以为任何类型
但object[]是继承于Array的,
你可能会认为即使Array的话,object也是其基类啊,为什么不可以转换呢
如果这样想的话,岂不表示object也是object[]的基类呢,显示是不对的
我只能说
object和object[]是两种不同的东西同时请参才下面的回答
object[] bb = ccc.Cast<object>().ToArray(); 既可,微软当初这么设计是为了兼容java的特性,不过缺少泛型的逆变和协变特性也的确对程序员们造成很多困惑,所以net4中特意加入了相关语法特性
而int[]也是同样的情况,而object[]和int[]之前完全没有任何直属关系,
只不过数组中的元素,是直属关系而已,当然他们都是继承自迭代类
object o =i; //装箱,使用一个引用类型来保存值类型的一个副本
int j =(int)o; //拆箱,显式将引用类型的内容转换为具体的值类型
数组中,同样存在这个概念。但是,前面说了,数组这个数据结构是无法整体转换的,因为它的存储结构不同,CLR在给数组分配内存时就确定了它存储内容的类型。object[]存储的内容可以是oject,也可以是装箱后的某个值类型的副本。int[]存储的是具体的int整型值类型。两个的存储结构不同,所以是无法整体转换的。
所以,泛型这个间接的解决方案是可行的。
class Stack<T>
{
public void push(T t){};
public void pop{};
}完全可以使用泛型来处理是需要使用存储内容为 object的数组还是int德数组的问题。泛型其实只是一个模板具体到泛型的对象分配内存时,同样是根据代码中声明的类型来确定泛型类型存储的结构内容了
object [] 也是一个数据类型所有的int 都是object
但是所有的 int [] 都不是 object []object [] 和 string [] 、double[] 一概没关系。。
后 int [] = object
两者是兄弟关系,不是继承关系。他们是不同的类型,跟集合中的数据类型没关系
lz大概被迷惑了,object[]和object级别差远了,完全不是一个概念层次。
值类型的数组和object[]数组是无法转换的,因为它是值类型。引用类型的数组可以转换,因为字符串数组string[]也是引用类型(字符串string也是引用类型),还有自定义类,即对象,都是引用类型,所以实际上是指针的调用。下面的代码:string[] s=new string[2]{"",""};object[] t = s;t[1] = "11";string[] tt=(string[])t;tt[1] = "22";你会看到数组中的内容发生了变化之后(只对这几个数组变量中的任一个进行赋值操作),其它的数组内容都变化了,说明这个只是引用了数组的指针而已,实际操作的是同一个托管堆对象。
string[] <-> object[] 确实可以的我的理解是 int[] 作为数组对象 也是引用类型,只是其中的元素是值类型。 问题导论到这里其实有点钻牛角尖的意思了,但还是希望有人能简单的说明一下这是为什么,希望通俗易懂。