匿名對象是強類型。 唯一值得關注的是,您無法知道型號名稱(不是直接)。
取本示例(抱歉,如果它太長):
static void T2()
{
var x = new
{
a = new { a1 = new Type1("x.1"), a2 = new Type2(1), a3 = new Type3('1') },
b = new { b1 = new Type1("x.2"), b2 = new Type2(2), b3 = new Type3('2') }
};
var y = new
{
a = new { a1 = new Type1("y.1"), a2 = new Type2(1), a3 = new Type3('1') },
b = new { b1 = new Type1("y.2"), b2 = new Type2(2), b3 = new Type3('2') }
};
var z = new
{
a = new { a1 = new Type1("y.1"), a2 = new Type3('1') },
b = new { b1 = new Type3('z'), b2 = new Type2(2) }
};
Console.WriteLine(new string('-', 40));
Console.WriteLine("Anonymous object \"x\" is named {0}.", x.GetType());
Console.WriteLine("Anonymous object \"y\" is named {0}.", y.GetType());
Console.WriteLine("Anonymous object \"z\" is named {0}.", z.GetType());
Console.WriteLine(new string('-', 40));
Console.Write("Anonymous object \"x\" == \"y\"? ");
Console.WriteLine(x.Equals(y) ? "Yes" : "No");
Console.Write("Anonymous object \"x\" == \"z\"? ");
Console.WriteLine(x.Equals(z) ? "Yes" : "No");
var x2 = new
{
a = new { a1 = new Type1("x.1"), a2 = new Type2(1), a3 = new Type3('1') },
b = new { b1 = new Type1("x.2"), b2 = new Type2(2), b3 = new Type3('2') }
};
Console.Write("Anonymous object \"x\" == \"x2\"? ");
Console.WriteLine(x.Equals(x2) ? "Yes" : "No");
// Uncomment it to give:
//Error 1 Cannot implicitly convert type 'AnonymousType#1' to 'AnonymousType#2'
#if GiveMeAnError
z = new
{
a = new { a1 = new Type1("z.1"), a2 = new Type2(1), a3 = new Type3('1') },
b = new { b1 = new Type1("z.2"), b2 = new Type2(2), b3 = new Type3('2') }
};
Console.WriteLine("Anonymous object \"z\" now is named {0}.", z.GetType());
Console.Write("Anonymous object \"x\" == \"z\"? ");
Console.WriteLine(x.Equals(z) ? "Yes" : "No");
#endif
Console.ReadKey();
}
它輸出:
/*----------------------------------------
Anonymous object "x" is named <>f__AnonymousType2`2[<>f__AnonymousType0`3 [anon_obj.Type1,anon_obj.Type2,anon_obj.Type3],<>f__AnonymousType1`3[anon_obj.Type1,anon_obj.Type2,anon_obj.Type3]].
Anonymous object "y" is named <>f__AnonymousType2`2[<>f__AnonymousType0`3[anon_obj.Type1,anon_obj.Type2,anon_obj.Type3],<>f__AnonymousType1`3[anon_obj.Type1,anon_obj.Type2,anon_obj.Type3]].
Anonymous object "z" is named <>f__AnonymousType2`2[<>f__AnonymousType3`2[anon_obj.Type1,anon_obj.Type3],<>f__AnonymousType4`2[anon_obj.Type3,anon_obj.Type2]].
----------------------------------------
Anonymous object "x" == "y"? No
Anonymous object "x" == "z"? No
Anonymous object "x" == "x2"? Yes*/
每個匿名對象組合物具有其自己的名稱和定義了一個獨特的類型。 使用相同類型和類型名稱聲明的對象轉到相同類型,如「x == x2」中所示。
儘管原始的例子很棘手,因爲它定義了「object []」數組中的「object []」數組。 這樣
var x = new object[ ]
{
new object[] { new Type1("x.1"), new Type2(1), new Type3('1') },
new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')}
};
var y = new object[ ]
{
new object[] { new Type1("y.1"), new Type2(1), new Type3('1') },
new object[] { new Type1("y.2"), new Type2(2) , new Type3('2')}
};
var z = new object[ ]
{
new object[] { new Type1("y.1"), new Type3('1') },
new object[] { new Type3('z'), new Type2(2)}
};
將全部被同一類型(對象[]),並且比較將永諾通過比較指針,這將完成,hopefuly,有所不同。
static void T1()
{
var x = new object[ ]
{
new object[] { new Type1("x.1"), new Type2(1), new Type3('1') },
new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')}
};
var y = new object[ ]
{
new object[] { new Type1("y.1"), new Type2(1), new Type3('1') },
new object[] { new Type1("y.2"), new Type2(2) , new Type3('2')}
};
var z = new object[ ]
{
new object[] { new Type1("y.1"), new Type3('1') },
new object[] { new Type3('z'), new Type2(2)}
};
Console.WriteLine(new string('-', 40));
Console.WriteLine("Anonymous object \"x\" is named {0}.", x.GetType());
Console.WriteLine("Anonymous object \"y\" is named {0}.", y.GetType());
Console.WriteLine("Anonymous object \"z\" is named {0}.", z.GetType());
Console.WriteLine(new string('-', 40));
Console.Write("Anonymous object \"x\" == \"y\"? ");
Console.WriteLine(x.Equals(y) ? "Yes" : "No");
Console.Write("Anonymous object \"x\" == \"z\"? ");
Console.WriteLine(x.Equals(z) ? "Yes" : "No");
var x2 = new object[ ]
{
new object[] { new Type1("x.1"), new Type2(1), new Type3('1') },
new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')}
};
Console.Write("Anonymous object \"x\" == \"x2\"? ");
Console.WriteLine(x.Equals(x2) ? "Yes" : "No");
z = new object[ ]
{
new object[] { new Type1("x.1"), new Type2(1), new Type3('1') },
new object[] { new Type1("x.2"), new Type2(2) , new Type3('2')}
};
Console.WriteLine("Anonymous object \"z\" now is named {0}.", z.GetType());
Console.Write("Anonymous object \"x\" == \"z\"? ");
Console.WriteLine(x.Equals(z) ? "Yes" : "No");
Console.Write("Anonymous object \"x\" == \"z\" (memberwise)? ");
Console.WriteLine(
x[ 0 ].Equals(z[ 0 ])
&& x[ 1 ].Equals(z[ 1 ])
? "Yes" : "No");
Console.ReadKey();
}
將輸出:
/*----------------------------------------
Anonymous object "x" is named System.Object[].
Anonymous object "y" is named System.Object[].
Anonymous object "z" is named System.Object[].
----------------------------------------
Anonymous object "x" == "y"? No
Anonymous object "x" == "z"? No
Anonymous object "x" == "x2"? No
Anonymous object "z" now is named System.Object[].
Anonymous object "x" == "z"? No
Anonymous object "x" == "z" (memberwise)? No
----------------------------------------*/
查看疑難雜症?
不錯!另一個爲什麼我喜歡瀏覽計算器的例子...每天學習新的東西。永遠不知道元組... – 2010-10-04 17:00:04