[英]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.