1

指定的强制转换无效

OrderItemState 是枚举

IEnumerable<OrderItemState> states = ...;
IEnumerable<byte> stateIds = Enumerable.Cast<byte>(states);

List<OrderEntry> entries =
  (from m in dc.OrderItemMotions
   where stateIds.Contains(m.OrderItemStateId)
   select ...).ToList();

为什么?

StackTrace 的一部分:

在 System.Linq.Enumerable.d__b1 1.MoveNext() at System.Linq.Enumerable.<OfTypeIterator>d__aa1.MoveNext() 在 System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 来源)在 System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 在 System.Data.Linq.SqlClient.QueryConverter.VisitInner 的 System.Data.Linq.SqlClient.QueryConverter.VisitContains(Expression sequence, Expression value) (表达式节点)在 System.Data.Linq.SqlClient.QueryConverter.Visit(表达式节点)在 System.Data.Linq.SqlClient.QueryConverter.VisitWhere(表达式序列,LambdaExpression 谓词)在 System.Data.Linq.SqlClient.QueryConverter。 VisitSequenceOperatorCall(MethodCallExpression mc) at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) at System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate) at System.Data.Linq.SqlClient.QueryConverter .VisitSequenceOperatorCall(MethodCallExpression mc) at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) at System.Data.Linq.SqlClient.QueryConverter.VisitGroupBy(Expression sequence, LambdaExpression keyLambda, LambdaExpression elemLambda, LambdaExpression resultSelector) at System.Data .Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) at System.Data.Linq.SqlClient.QueryConverter.VisitJoin(Expression outerSequence, Expression innerSequence, LambdaExpression outerKeySelector, System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 在 System.Data.Linq.SqlClient.QueryConverter 的 LambdaExpression innerKeySelector、LambdaExpression resultSelector)。在 System.Data.Linq.SqlClient.SqlProvider.BuildQuery(表达式查询,SqlNodeAnnotations 注释)在 System.Data.Linq.SqlClient.SqlProvider 的 System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(表达式节点)的 VisitInner(表达式节点) System.Data.Linq.DataQuery 处的 .System.Data.Linq.Provider.IProvider.Execute(表达式查询)1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 源)

4

3 回答 3

2

您不能在没有数据丢失的情况下将 anenum转换为 a byte,因此转换将失败(在引擎盖下enum是 a )。int

但是,如果您只想使用 0-255 范围内的值,则可以定义一个enum使用引擎盖下的值:byte

public enum Values : byte { val1, val2};

见这里:http: //msdn.microsoft.com/en-us/library/sbbt4032.aspx

于 2012-07-13T08:56:16.367 回答
0

如果枚举的基本类型是 int(这是默认值),您可以将枚举强制转换为 int。

如果枚举的基本类型是字节,则可以将枚举强制转换为字节。

于 2012-07-13T08:55:59.453 回答
0

您的枚举值中的一个很可能包含一个无法放入byte.

假设这段代码:

IEnumerable<MyEnum> arr = new MyEnum[] { MyEnum.first, MyEnum.second };
var bytes = Enumerable.Cast<byte>(arr);
foreach (var b in bytes)
{
    Console.WriteLine(b);
}

如果出现以下情况,它将起作用:

enum MyEnum:byte { first = 120, second };

如果出现以下情况,它将不起作用:

enum MyEnum:long { first = 1204, second };
于 2012-07-13T08:56:45.437 回答