【问题标题】:Specified Cast Invalid Byte to int [duplicate]指定将无效字节转换为 int [重复]
【发布时间】:2015-04-12 06:22:21
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你的意思是“无效”?您遇到的异常或编译错误或问题是什么?
  • 它是一个 linq 函数,它提供给我的所有信息

标签: c# linq casting int byte


【解决方案1】:

出现此异常的原因?

首先,让我们试试这个:

 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&lt;T&gt;

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();

【讨论】:

  • 您可以毫无问题地将byte 转换为int
  • 为什么在 ie 的示例 (x => (int)x) 中看到装箱对 select 起作用
  • @Space,(x =&gt; (int)x) 中没有装箱,装箱会涉及值类型和引用类型之间的转换。 Cast 抛出异常是因为 foreach (object obj in source) 中的装箱,其中 byte 类型首先转换为 object,然后在 return (TResult)obj 中转换为 int
  • @Space 正如 Habib 所说,没有任何拳击操作。因为intbyte 都是值类型。
【解决方案2】:

以下将起作用:

AllMarketRights.Select(x => (int)x).ToList();

要了解为什么Cast&lt;int&gt; 会产生异常,我们可以查看它的实现:

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)。

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    相关资源
    最近更新 更多