指定将无效字节转换为 int

Specified Cast Invalid Byte to int

我正在尝试将字节列表转换为整数列表。

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

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

11 应该可以转换为 INT 有谁知道为什么这个转换无效,以及将字节列表转换为 int 列表的最短方法吗?

以下将起作用:

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(其中拆箱实际上应该发生,装箱 byte 不能像 int 那样拆箱)。

异常原因?

首先,让我们试试这个:

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

如您所见,InvalidCastException 将被抛出。因为,一个装箱值只能拆箱到完全相同类型的变量.

现在,让我们看看 Cast() 在做什么。你可以看看这个方法的实现 here. As you see, it will return CastIterator. And 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();