根據參數是任意深度的數組還是非數組(值),編寫對於給定類型行爲不同的函數。對於數組類型,重載遍歷數組並遞歸。我想遞歸調用數組參數重載遞歸調用子數組。然而,遞歸調用直接進入值類型重載。我寧願避免基於運行時的功能,如自省。基於數組參數類型的調度遞歸泛型函數調用
使用Visual Studio 2010 .Net 4雖然也想支持.Net 3.5。
namespace Quickie.StackOverflow.GenericMethodDispatch
{
class TestGenericMethodDispatch
{
static private void GenericDereferenceArray<T>(T t)
{
Console.WriteLine(string.Format("GenericDereferenceArray<T>(T t) got a {0} which thinks it's a {1}, {2}", typeof(T), t.GetType(), t));
}
static private void GenericDereferenceArray<T>(T[] t)
{
Console.WriteLine(string.Format("GenericDereferenceArray<T>(T[] t) got a {0} which thinks it's a {1}", typeof(T[]), t.GetType()));
foreach (T iter in t)
{
GenericDereferenceArray(iter);
}
}
static public void TestGenericDereferenceArray()
{
Console.WriteLine();
Console.WriteLine("===TestGenericDereferenceArray()===");
Console.WriteLine("====Dereference an int====");
int i = 1;
GenericDereferenceArray(i);
Console.WriteLine();
Console.WriteLine("====Dereference an int[]====");
int[] ai = { 1 };
GenericDereferenceArray(ai);
Console.WriteLine();
Console.WriteLine("====Dereference an int[][]====");
int[][] aai = { new int[] { 2 } };
GenericDereferenceArray(aai);
Console.WriteLine();
}
} // Ends class TestGenericMethodDispatch
} // Ends namespace Quickie.StackOverflow.GenericMethodDispatch
輸出:
=== TestGenericDereferenceArray()===
====解除引用字符串====
GenericDereferenceArray(T t)的有以System.String其認爲這是以System.String,FOO====解除引用的int ====
GenericDereferenceArray(T T)有一個System.Int32其中認爲它是一個System.Int32,1====解除引用的int [] ====
GenericDereferenceArray(T [] T)有一個System.Int32其中認爲它是一個System.Int32 []
GenericDereferenceArray(T t)的[]得到一個System.Int32其中認爲它是一個System.Int32,1個====解除引用的int [] [] ====
GenericDereferenceArray(T [] T)有一個System.Int32 [] []它認爲這是一個System.Int32 [] []
GenericDereferenceArray(T t)得到一個System.Int32 []它認爲它是一個System.Int32 [],System.Int32 []
希望能後者輸出本來
====解除引用的int [] [] ====
GenericDereferenceArray(T [] T)有一個System.Int32 [] [],其認爲它是一個System.Int32 [] []
GenericDereferenceArray(T [] t)得到一個System.Int32 [ System.Int32,System.Int32
很明顯,從輸出中調用「GenericDereferenceArray(T t)」。這並不能幫助我理解爲什麼,或者是否有解決方法,不需要這種類型的投射。投射到你知道的東西是有效的,對我來說是錯誤的。將T [] []數組的元素投射到T []或IEnumerable 似乎是多餘的。 –
WaffleSouffle
2011-12-14 17:21:56
因爲當你調用`GenericDereferenceArray(iter)`時,你傳遞的是對象而不是_explicit_對象數組。儘管_technically_是一個數組,編譯器會將它連接到T版本。 – 2011-12-16 21:34:54