0Pricing
C# Academy · レッスン

コレクションのターゲット型指定

ターゲット型にコレクション作成を任せます。

「コレクションのターゲット型指定」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

ターゲット型推論とは

ターゲット型推論とは、右辺に明示的な型を指定するのではなく、コレクション式が使用されるコンテキストから、コンパイラが何を構築するかを推論する仕組みです。

using System;

int[] numbers = [1, 2, 3]; // target type is int[]
Console.WriteLine(numbers.GetType().Name); // Int32[]

ターゲットが型を決める

同じリテラルでも、代入先の変数、パラメーター、または戻り値の型に応じて、異なる具体的な型になります。

using System;
using System.Collections.Generic;

int[] asArray = [1, 2, 3];
List<int> asList = [1, 2, 3];
Console.WriteLine(asArray is int[]);  // True
Console.WriteLine(asList is List<int>); // True

メソッド呼び出しでのターゲット型推論

メソッドのパラメーターがコレクション型の場合、引数のリテラルはそのパラメーターをターゲット型として推論されます。

using System;
using System.Collections.Generic;

static void Show(List<int> items) =>
    Console.WriteLine(string.Join(",", items));

Show([10, 20, 30]); // target-typed to List<int>

戻り値でのターゲット型推論

メソッド本体では、コレクション式を単独で返せます。宣言された戻り値の型がターゲット型になります。

using System;
using System.Collections.Generic;

static List<string> Tags() => ["csharp", "dotnet", "ranges"];

Console.WriteLine(Tags().Count); // 3

要素型の推論

要素型はターゲット型から決まります。ターゲットが double[] の場合、整数リテラルは自動的に double に拡大変換されます。

using System;

double[] values = [1, 2, 3]; // ints widen to double
Console.WriteLine(values[0] + 0.5); // 1.5

ターゲットとしてのインターフェイス

コレクション式のターゲットには、IEnumerable<T>、IReadOnlyList<T>、ICollection<T> などのインターフェイスも指定できます。コンパイラが適切な具象型を選択します。

using System;
using System.Collections.Generic;

IReadOnlyList<int> ro = [1, 2, 3];
Console.WriteLine(ro.Count); // 3

三項演算子とターゲット型推論

条件式の両方の分岐をコレクション式にでき、それぞれが共通の結果型をターゲットとして推論されます。

using System;

bool useDefaults = false;
int[] config = useDefaults ? [0, 0, 0] : [1, 2, 3];
Console.WriteLine(string.Join(",", config)); // 1,2,3

var はターゲットにならない

var x = [1, 2, 3]; と記述することはできません。var はターゲット型を提供しないためです。明示的な型を指定するか、型が必要な場所で式を使用してください。

using System;

// var x = [1, 2, 3]; // compile error: no target type
int[] x = [1, 2, 3]; // ok
Console.WriteLine(x.Length); // 3

スプレッドでのターゲット型推論

ターゲット型推論とスプレッドは連携します。ターゲットが最終的なコレクション型を決め、スプレッドがその内容を提供します。

using System;
using System.Collections.Generic;

int[] src = [1, 2, 3];
List<int> copy = [..src]; // copies into a List<int>
Console.WriteLine(copy is List<int>); // True

記述量を減らす

ターゲット型推論によって、型名の繰り返しを省けます。冗長な従来の形式と簡潔な新しい形式を比較してください。

using System;

// old: type repeated
int[] oldWay = new int[] { 1, 2, 3 };
// new: type only on the left
int[] newWay = [1, 2, 3];
Console.WriteLine(oldWay.Length == newWay.Length); // True

総合例

ここでは、1つのヘルパーが任意の読み取り専用コレクションを受け取り、呼び出し側がターゲット型付きリテラルを自由に渡しています。

using System;
using System.Collections.Generic;

static int Count(IReadOnlyCollection<int> c) => c.Count;

Console.WriteLine(Count([1, 2, 3, 4])); // 4

理解度チェック

ターゲット型推論を理解できているか確認しましょう。

まとめ

コレクション式でターゲット型がどのように推論されるかを学びました。

  • 代入先の型(変数、パラメーター、戻り値)が構築方法を決めます。
  • 要素型はターゲット型に合わせて拡大変換される場合があります。
  • IReadOnlyList<T> などのインターフェイスも有効なターゲットです。
  • var はターゲットになりません。

よくある質問

「コレクションのターゲット型指定」レッスンは無料ですか?

はい。「コレクションのターゲット型指定」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「コレクションのターゲット型指定」で何を学びますか?

ターゲット型にコレクション作成を任せます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「コレクションのターゲット型指定」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コレクション式の構文
  2. Spread要素
  3. コレクションのターゲット型指定
  4. コレクションビルダー
← C# Academyに戻る