指定将无效字节转换为 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 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();
我正在尝试将字节列表转换为整数列表。
我的字节列表只包含一个值 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 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();