where — Ograniczenie typu ogólnego (odwołanie w C#)where (generic type constraint) (C# Reference)

where Klauzula w definicji ogólnej określa ograniczenia dotyczące typów, które są używane jako argumenty parametrów typu w typie ogólnym, metodzie, delegatze lub funkcji lokalnej.The where clause in a generic definition specifies constraints on the types that are used as arguments for type parameters in a generic type, method, delegate, or local function. Ograniczenia mogą określać interfejsy, klasy bazowe lub wymagać typu ogólnego, aby być odwołaniem, wartością lub typem niezarządzanym.Constraints can specify interfaces, base classes, or require a generic type to be a reference, value, or unmanaged type. Deklarują możliwości, że argument typu musi mieć wartość.They declare capabilities that the type argument must possess.

Na przykład można zadeklarować klasę MyGenericClassgeneryczną, w taki sposób, aby parametr T typu implementuje IComparable<T> interfejs:For example, you can declare a generic class, MyGenericClass, such that the type parameter T implements the IComparable<T> interface:

public class AGenericClass<T> where T : IComparable<T> { }

Uwaga

Aby uzyskać więcej informacji na temat klauzuli WHERE w wyrażeniu zapytania, zobacz klauzula WHERE.For more information on the where clause in a query expression, see where clause.

where Klauzula może również zawierać ograniczenie klasy bazowej.The where clause can also include a base class constraint. Ograniczenie klasy bazowej określa, że typ, który ma być używany jako argument typu dla tego typu ogólnego ma określoną klasę jako klasę bazową (lub jest tą klasą bazową), która ma być używana jako argument typu dla tego typu ogólnego.The base class constraint states that a type to be used as a type argument for that generic type has the specified class as a base class (or is that base class) to be used as a type argument for that generic type. Jeśli jest używane ograniczenie klasy bazowej, musi ono znajdować się przed innymi ograniczeniami tego parametru typu.If the base class constraint is used, it must appear before any other constraints on that type parameter. Niektóre typy są niedozwolone jako ograniczenie klasy bazowej: Object, Array, i ValueType.Some types are disallowed as a base class constraint: Object, Array, and ValueType. Przed C# 7,3, Enum Delegate, iMulticastDelegate były również niedozwolone jako ograniczenia klas podstawowych.Prior to C# 7.3, Enum, Delegate, and MulticastDelegate were also disallowed as base class constraints. W poniższym przykładzie przedstawiono typy, które można teraz określić jako klasę bazową:The following example shows the types that can now be specified as a base class:

public class UsingEnum<T> where T : System.Enum { }

public class UsingDelegate<T> where T : System.Delegate { }

public class Multicaster<T> where T : System.MulticastDelegate { }

Klauzula może określać, że typem class jest lub struct. whereThe where clause can specify that the type is a class or a struct. Ograniczenie eliminuje konieczność określenia System.ValueTypeograniczenia klasy bazowej. structThe struct constraint removes the need to specify a base class constraint of System.ValueType. System.ValueType Typ nie może być używany jako ograniczenie klasy bazowej.The System.ValueType type may not be used as a base class constraint. W poniższym przykładzie przedstawiono zarówno class warunek, jak i: structThe following example shows both the class and struct constraints:

class MyClass<T, U>
    where T : class
    where U : struct
{ }

where Klauzula możenotnull zawierać ograniczenie.The where clause may include the notnull constraint. notnull Ograniczenie ogranicza parametr typu do typu niedopuszczający wartości null.The notnull constraint limits the type parameter to non-nullable types. Ten typ może być typem wartości lub typem referencyjnym, który nie dopuszcza wartości null.That type may be a value type or a non-nullable reference type. To ograniczenie jest dostępne od nullable enable C# 8,0 do kodu skompilowanego w kontekście. notnullThe notnull constraint is available starting in C# 8.0 for code compiled in a nullable enable context. W przeciwieństwie do innych ograniczeń, jeśli argument typu narusza notnull ograniczenie, kompilator generuje ostrzeżenie zamiast błędu.Unlike other constraints, if a type argument violates the notnull constraint, the compiler generates a warning instead of an error. Ostrzeżenia są generowane tylko w nullable enable kontekście.Warnings are only generated in a nullable enable context.

Ważne

Deklaracje ogólne zawierające notnull ograniczenie mogą być używane w kontekście wartości null Oblivious, ale kompilator nie wymusza ograniczenia.Generic declarations that include the notnull constraint can be used in a nullable oblivious context, but compiler does not enforce the constraint.

#nullable enable
    class NotNullContainer<T>
        where T : notnull
    {

    }
#nullable restore

Klauzula może również unmanaged zawierać ograniczenie. whereThe where clause may also include an unmanaged constraint. Ograniczenie ogranicza parametr typu do typów znanych jako typy niezarządzane. unmanagedThe unmanaged constraint limits the type parameter to types known as unmanaged types. To unmanaged ograniczenie ułatwia zapisanie kodu międzyoperacyjności niskiego poziomu w C#programie.The unmanaged constraint makes it easier to write low-level interop code in C#. To ograniczenie umożliwia wykonywanie procedur wielokrotnego użytku we wszystkich typach niezarządzanych.This constraint enables reusable routines across all unmanaged types. Nie można połączyć class struct ograniczenia z ograniczeniem or. unmanagedThe unmanaged constraint can't be combined with the class or struct constraint. Ograniczenie wymusza, że typ musi structbyć: unmanagedThe unmanaged constraint enforces that the type must be a struct:

class UnManagedWrapper<T>
    where T : unmanaged
{ }

Klauzula może również zawierać new()ograniczenie konstruktora. whereThe where clause may also include a constructor constraint, new(). To ograniczenie umożliwia utworzenie wystąpienia parametru typu za pomocą new operatora.That constraint makes it possible to create an instance of a type parameter using the new operator. To ograniczenie New () umożliwia kompilatorowi, że każdy dostarczony argument typu musi mieć dostępny bez parametrów--lub default--konstruktora.The new() Constraint lets the compiler know that any type argument supplied must have an accessible parameterless--or default-- constructor. Na przykład:For example:

public class MyGenericClass<T> where T : IComparable<T>, new()
{
    // The following line is not possible without new() constraint:
    T item = new T();
}

Ograniczenie jest wyświetlane jako ostatnie where w klauzuli. new()The new() constraint appears last in the where clause. Nie można połączyć struct unmanaged ograniczenia z ograniczeniami lub. new()The new() constraint can't be combined with the struct or unmanaged constraints. Wszystkie typy spełniające te ograniczenia muszą mieć dostępny Konstruktor bez parametrów, co sprawia, new() że ograniczenie jest nadmiarowe.All types satisfying those constraints must have an accessible parameterless constructor, making the new() constraint redundant.

W przypadku wielu parametrów typu należy użyć where jednej klauzuli dla każdego parametru typu, na przykład:With multiple type parameters, use one where clause for each type parameter, for example:

public interface IMyInterface { }

namespace CodeExample
{
    class Dictionary<TKey, TVal>
        where TKey : IComparable<TKey>
        where TVal : IMyInterface
    {
        public void Add(TKey key, TVal val) { }
    }
}

Można również dołączyć ograniczenia do parametrów typu metod ogólnych, jak pokazano w następującym przykładzie:You can also attach constraints to type parameters of generic methods, as shown in the following example:

public void MyMethod<T>(T t) where T : IMyInterface { }

Zauważ, że składnia opisująca ograniczenia parametru typu dla delegatów jest taka sama jak w przypadku metod:Notice that the syntax to describe type parameter constraints on delegates is the same as that of methods:

delegate T MyDelegate<T>() where T : new();

Aby uzyskać informacje na temat delegatów ogólnych, zobacz Delegaty ogólne.For information on generic delegates, see Generic Delegates.

Aby uzyskać szczegółowe informacje na temat składni i użycia ograniczeń, zobacz ograniczenia dotyczące parametrów typu.For details on the syntax and use of constraints, see Constraints on Type Parameters.

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.For more information, see the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also