2010-02-26 41 views
3
object obj = new object[] { new object(), new object() }; 

这是如何编译的?这似乎令人困惑。这是如何编译的? c#

似乎应该或者是

object[] obj = new object[] { new object(), new object() }; 

object[] obj = { new object(), new object() }; 
+4

它编译,因为你总是可以声明一个类型为'object'的变量,并用你喜欢的任何东西在右边初始化它。如果它是一个值类型,它将被装箱。 – 2010-02-26 09:39:06

+0

对象是C#的空指针。它可能指向任何东西。 – 2010-02-26 09:42:10

回答

3

它编译是因为“对象”可以是任何东西,因此它可以是对象数组的引用。下面的代码使用字符串来使区分更清晰一些,可能会有所帮助。所以:

List<string> myStrings = new List<string>() { "aa", "bb" }; 
// Now we have an array of strings, albeit an empty one 
string[] myStringsArray = myStrings.ToArray(); 
// Still a reference to myStringsArray, just held in the form of an object 
object stillMyStringsArray = (object)myStringsArray; 

// Get another array of strings and hold in the form of an object 
string[] anotherArray = myStrings.ToArray(); 
object anotherArrayAsObject = (object)anotherArray; 

// Store both our objects in an array of object, in the form of an object 
object myStringArrays = new object[] { stillMyStringsArray, anotherArrayAsObject }; 

// Convert myStringArrays object back to an array of object and take the first item in the array 
object myOriginalStringsArrayAsObject = ((object[])myStringArrays)[0]; 
// Conver that first array item back into an array of strings 
string[] myOriginalStringsArray = (string[])myOriginalStringsArrayAsObject; 

本质上,一个对象总是可以引用任何东西,甚至是一个对象数组。对象并不在乎它里面放的是什么,所以在代码的最后,我们已经有了一个字符串数组。在Visual Studio中运行该代码,在其中放入几个断点并按照它进行操作。它会希望帮助你理解为什么你指定的代码是有效的=)

6

目的是用于一切的基础。 任何东西都可以分配给一个对象类型的变量。

1

object obj = ...这里可能指的是一个Collection。并不是说这里'对象'的不同用法是指相同类型的对象。

1

对象数组是一个对象,但这确实很奇怪。

+1

对我来说,看起来并不奇怪。这是C# – Slavo 2010-02-26 09:42:19

2

object obj = new object[] { ...} 

右手部分确实得到object[]类型的引用,但是该类型,像任何其他类型的,是分配兼容object