指定将无效字节转换为int

时间:2015-02-11 18:34:29

标签: c# linq casting int byte

我正在尝试将一个字节列表转换为一个int列表。

我的字节列表只包含一个值11。

tmpMarketRights = AllMarketRights.Cast<int>().ToList();

11应该能够被转换为INT有没有人知道为什么这个转换是无效的,以及将字节列表转换为int列表的最短方法?

2 个答案:

答案 0 :(得分:4)

此异常的原因?

首先,让我们试试这个:

 byte myByte = 11;
 object myObject = myByte;
 int x = (int)myObject; // Exception will be thrown here

如您所见,InvalidCastException将被抛出。因为, 盒装值 只能取消装入 完全相同类型的 变量。

现在,让我们看看Cast()在做什么。您可以查看此方法here的实现。如您所见,它将返回CastIterator。而hereCastIterator

的实现
static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) 
{
     foreach (object obj in source) yield return (TResult)obj;
}

如您所见,它不会byte投放到int,而object投放到int。这样做的原因是,CastIEnumerable的扩展方法,而不是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)。