ホームページ > バックエンド開発 > C++ > .NET 3.5 SP1 で「Enumerable.Cast」が「InvalidCastException」をスローするのはなぜですか?

.NET 3.5 SP1 で「Enumerable.Cast」が「InvalidCastException」をスローするのはなぜですか?

Linda Hamilton
リリース: 2025-01-10 09:35:41
オリジナル
900 人が閲覧しました

Why Does `Enumerable.Cast` Throw an `InvalidCastException` in .NET 3.5 SP1?

.NET 3.5 SP1 では Enumerable.CastInvalidCastException

をスローします

.NET 3.5 SP1 では、Enumerable.Cast メソッドを使用してある型のコレクションを別の型に変換するときに特別な動作が観察されました。次のコード:

<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());</code>
ログイン後にコピー

が予期せず InvalidCastException を投げます。この不可解なエラーは、次のコードに示すように、LINQ 構文を使用するときにも発生します。

<code class="language-csharp">var list = new[] { 1 };
var castedList = from long l in list select l;
Console.WriteLine(castedList.First());</code>
ログイン後にコピー

隠れた動作を明らかにする

最初は、なぜこの変換が失敗するのか混乱するように思えます。ただし、ブログ投稿で潜在的な問題が明らかになりました。 .NET 3.5 SP1 では、

メソッドは、Cast<T>() ではなく IEnumerable で動作するように変更されました。したがって、コレクション内の各要素は、変換段階に到達する前に IEnumerable<T> にボックス化されます。 System.Object

根本原因の暴露

この根本的な変化は微妙な問題を引き起こします。

は基本的に、次の変換を試行することによって発生します: InvalidCastException

<code class="language-csharp">int i = 1;
object o = i;
long l = (long)o;</code>
ログイン後にコピー
このコードが示すように、

int に直接変換すると期待どおりの結果が得られますが、ボックス化された longint に変換すると失敗します。これは、最初のコード スニペットとそれに対応する LINQ が期待どおりに動作しない理由を説明しています。 long

解決策を探しています

この例外を回避するには、変換を明示的に実行する必要があります:

<code class="language-csharp">var castedList = list.Select(i => (long)i);</code>
ログイン後にコピー
この代替メソッドは、無効な変換例外が発生することなく、各要素を正常に変換します。

この異常な動作は、いくつかの微妙な舞台裏のメカニズムがコードの実行に影響を与える可能性があることを思い出させます。将来同様の落とし穴が起こらないようにするために、代替手段を検討するか、変換を明示的に処理する価値があります。

以上が.NET 3.5 SP1 で「Enumerable.Cast」が「InvalidCastException」をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート