我正在尝试将一个字节列表转换为一个int列表。
我的字节列表只包含一个值11。
tmpMarketRights = AllMarketRights.Cast<int>().ToList();
11应该能够被转换为INT有没有人知道为什么这个转换是无效的,以及将字节列表转换为int列表的最短方法?
答案 0 :(得分:4)
此异常的原因?
首先,让我们试试这个:
byte myByte = 11;
object myObject = myByte;
int x = (int)myObject; // Exception will be thrown here
如您所见,InvalidCastException
将被抛出。因为, 盒装值 只能取消装入 完全相同类型的 变量。
现在,让我们看看Cast()
在做什么。您可以查看此方法here的实现。如您所见,它将返回CastIterator
。而here是CastIterator
:
static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
{
foreach (object obj in source) yield return (TResult)obj;
}
如您所见,它不会byte
投放到int
,而object
投放到int
。这样做的原因是,Cast
是IEnumerable
的扩展方法,而不是IEnumerable<T>
。
public static IEnumerable<TResult> Cast<TResult>(
this IEnumerable source
)
所以请使用以下方法之一:
var tmpMarketRights = AllMarketRights.Select(x => Convert.ToInt32(x)).ToList();
var tmpMarketRights = AllMarketRights.Select(x => (int)x).ToList();
答案 1 :(得分:2)
以下内容可行:
AllMarketRights.Select(x => (int)x).ToList();
要理解Cast<int>
产生异常的原因,我们可以研究它的实现:
public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) {
IEnumerable<TResult> typedSource = source as IEnumerable<TResult>;
if (typedSource != null) return typedSource;
if (source == null) throw Error.ArgumentNull("source");
return CastIterator<TResult>(source);
}
static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) {
foreach (object obj in source) yield return (TResult)obj;
}
我们可以看到CastIterator
没有尝试将byte
转换为int
(可以应用数字显式强制转换),但是object
(其中unbox实际上应该发生了,并且框byte
无法取消装箱为int
)。