1

指定されたキャストは無効です

OrderItemState はenumです。

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.VisitContains(式のシーケンス、式の値) で System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) で System.Data.Linq.SqlClient.QueryConverter.VisitInner で(式ノード) System.Data.Linq.SqlClient.QueryConverter.Visit で (式ノード) System.Data.Linq.SqlClient.QueryConverter.VisitWhere で (式シーケンス、LambdaExpression 述語) System.Data.Linq.SqlClient.QueryConverter で。 System.Data.Linq.SqlClient.QueryConverter.VisitInner(式ノード) の VisitSequenceOperatorCall(MethodCallExpression mc) .System.Data.Linq.SqlClient.QueryConverter.VisitInner(式ノード) での VisitSequenceOperatorCall(MethodCallExpression mc) .Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression ノード) で System.Data.Linq.SqlClient.QueryConverter.VisitJoin(Expression outerSequence, Expression innerSequence, LambdaExpression outerKeySelector, System.Data.Linq.SqlClient.QueryConverter.System.Data.Linq.SqlClient.QueryConverter.ConvertOuter (式ノード) の VisitInner (式ノード) .System.Data.Linq.Provider.IProvider.Execute (式クエリ) で System.Data.Linq.DataQuery1.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ため、キャストは失敗します (enumintフードの下にあります)。

ただし、以下enumを使用してbyte0 ~ 255 の範囲の値のみが必要な場合は、内部を使用するように を定義できます。

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

ほとんどの場合、列挙型の値の 1 つに、 に収まらない値が含まれています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 に答える