[英]Array[] - Can't get the value in Array[] C# “cannot implicitly convert type object to int”
[英]C# Convert object of type array to T, where T is an array?
如果我能讓 object 到數組轉換正常工作,那就太好了。
腳步:
對於初學者來說,這很好用
double[] r=Array.ConvertAll<int,double>((int[])o,Convert.ToDouble)
但這不是(假設 T 是“double”)例如 double[] R=getValue(o);
public T[] getValue<T>(object o){
// ... some logic...
return (T[])Array.ConvertAll<int,double>((int[])o,Convert.ToDouble)
是否有可以使用的 where 約束? 數組是一個“特殊對象”,所以我們不能將其用作約束。
這是否可能在 .net 中不訴諸 IL? 如果我們求助於 IL,是否有可能?
謝謝,-史蒂文
這對我有用:
public T[] GetValue<T>(object o)
{
Converter<int, T> c = new Converter<int, T>(input => (T)System.Convert.ChangeType(input, typeof(T)));
return (T[])Array.ConvertAll<int, T>((int[])o, c);
}
我希望這有幫助!
試試這個:
public T[] getValue<T>(object o)
{
return (T[])Convert.ChangeType(o, typeof(T[]));
}
使用這樣:
object doubleArr = new Double[] {1.3, 1.5, 1.7};
var returnedValue = getValue<double>(doubleArr);
請注意,如果為模板傳入了錯誤的類型,它將在運行時失敗
- 刪除了之前的內容
對不起,我沒有看到當然不能編譯的Convert.ToDouble。 為了能夠處理任何類型的T,您必須將轉換回調傳遞給getValue
。
這樣的事情應該做的工作:
public T[] getValue<T>(object o, Converter<int, T> converter)
{
// ... some logic...
return (T[])Array.ConvertAll<int,T>((int[])o, converter)
}
用法:
double[] result = getValue<double>(o, (i) => Convert.ToDouble(i));
以上三個答案都有效。 真棒。 非常感謝。
一個問題:在上面的符號中,調用者中的Convert.ToDouble
變為(i) => Convert.ToDouble(i)
。 符號是否相等?
我是新來的......我應該以某種方式接受答案嗎? 不知道我能否,因為當我發布問題時,我沒有注冊。
在上述答案的擴展中,我得到了這個非常簡潔的解決方案:
public T[,,] getValue_3d<T>(object o) {
return (T[,,])Convert.ChangeType(o,typeof(T[,,]));
}
用法:
object doubleArr=new Double[,,] { { { 1, 2, 3 }, { 4, 5, 6 } },
{ { 7, 8, 9 }, { 10, 11, 12 } } };
double[,,] returnedValue=getValue_3d<double>(doubleArr);
我最初嘗試的一件事就是讓T(其中T是一個n級數組),獲取元素類型,然后進行轉換。 從函數返回值時,它不能很好地工作。
為了更加整潔地做到這一點,如果我們可以使用函數返回值進行重載,那就太好了......但據我所知,這在C#設計中是不可能的。 也許還有另外一招。 也試過TIn + TOut無濟於事(TIn是雙倍的,TOut是double[]
/ double[,]
/ double[,,]
。
再次感謝。
這是另一個解決方案:D
public T[] getValue<T>(object o) => o as T[];
但是,這可能會返回一個null
值,因為它是如何as
的(而不是崩潰——這可能是一件好事?)。 as
在運行時工作,所以要小心你如何使用它,但如果你使用object
s 那么你已經在危險的水域中航行了。
我喜歡執行以下操作,這樣我就不必到處處理null
。
public T[] getValue<T>(object o) => o as T[] ?? Array.Empty<T>();
此外,這樣你就不必使用另一個間接級別:3
編輯:我也注意到你說過
通常 object 是一個 int[] 或 double[],但我們通常需要 double[]。
如果你知道你只想要這兩種類型,那么你也可以更明確:
public T[] getValue<T>(object o) => o switch {
int[] array => array as T[],
double[] array => array as T[],
var _ => null,
} ?? Array.Empty<T>();
也許維護起來更痛苦,但它更明確一些。 除了返回null
,您還可以拋出錯誤以確保您沒有傳遞錯誤的類型。
我希望這對某人有幫助:3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.