0Pricing
C# Academy · Lekcja

Wnioskowanie typu docelowego kolekcji

Pozwól typowi docelowemu sterować tworzeniem kolekcji.

Wnioskowanie typu docelowego kolekcji to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Czym jest typowanie kontekstowe?

Typowanie kontekstowe oznacza, że kompilator określa, co powinno zostać utworzone przez wyrażenie kolekcji na podstawie kontekstu jego użycia, a nie na podstawie jawnie określonego typu po prawej stronie.

using System;

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

Typ docelowy określa typ

Ten sam literał staje się innym typem konkretnym w zależności od typu zmiennej, parametru lub wartości zwracanej, do którego trafia.

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

Typowanie kontekstowe w wywołaniach metod

Gdy parametr metody jest typem kolekcji, literał argumentu otrzymuje kontekstowo typ tego parametru.

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>

Typowanie kontekstowe w wartościach zwracanych

Ciało metody może zwracać samo wyrażenie kolekcji; zadeklarowany typ zwracany dostarcza typ docelowy.

using System;
using System.Collections.Generic;

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

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

Wnioskowanie typu elementów

Typ elementów pochodzi z typu docelowego. Jeśli typem docelowym jest double[], literały całkowite są automatycznie konwertowane do typu double.

using System;

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

Interfejsy jako typy docelowe

Wyrażenia kolekcji mogą mieć jako typ docelowy interfejsy, takie jak IEnumerable<T>, IReadOnlyList<T> lub ICollection<T>; kompilator wybiera odpowiedni typ konkretny.

using System;
using System.Collections.Generic;

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

Operator warunkowy a typowanie kontekstowe

Obie gałęzie wyrażenia warunkowego mogą być wyrażeniami kolekcji, z których każda otrzymuje kontekstowo wspólny typ wynikowy.

using System;

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

var nie jest typem docelowym

Nie można napisać var x = [1, 2, 3];, ponieważ var nie dostarcza typu docelowego. Należy podać typ jawnie albo użyć wyrażenia w miejscu, w którym oczekiwany jest określony typ.

using System;

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

Typowanie kontekstowe z elementami rozpraszającymi

Typowanie kontekstowe i elementy rozpraszające współpracują ze sobą: typ docelowy określa końcowy typ kolekcji, a elementy rozpraszające dostarczają jej zawartość.

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

Ograniczanie zbędnego kodu

Typowanie kontekstowe usuwa powtarzające się nazwy typów. Porównaj nadmiarową starą formę ze zwięzłą nową.

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

Zastosowanie w praktyce

W tym przykładzie pojedynczy pomocnik przyjmuje dowolną kolekcję tylko do odczytu, a wywołujący może swobodnie przekazywać literały typowane kontekstowo.

using System;
using System.Collections.Generic;

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

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

Szybkie sprawdzenie

Sprawdź, jak dobrze rozumiesz typowanie kontekstowe.

Podsumowanie

Poznałeś sposób kontekstowego typowania wyrażeń kolekcji.

  • Typ docelowy (zmienna, parametr lub wartość zwracana) określa sposób utworzenia kolekcji.
  • Typy elementów mogą zostać rozszerzone, aby dopasować się do typu docelowego.
  • Interfejsy, takie jak IReadOnlyList<T>, są prawidłowymi typami docelowymi.
  • var nie może być typem docelowym.

Często zadawane pytania

Czy lekcja „Wnioskowanie typu docelowego kolekcji” jest bezpłatna?

Tak — pełny tekst „Wnioskowanie typu docelowego kolekcji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wnioskowanie typu docelowego kolekcji”?

Pozwól typowi docelowemu sterować tworzeniem kolekcji. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Wnioskowanie typu docelowego kolekcji”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Składnia wyrażeń kolekcji
  2. Element rozpakowywania
  3. Wnioskowanie typu docelowego kolekcji
  4. Konstruktory kolekcji
← Powrót do C# Academy