Where-klausulen används för att specificera typbegränsningar som kan fungera som variabler för typparametrar definierade i generiska deklarationer. 1. Gränssnittsbegränsningar. Till exempel kan du deklarera en generisk klass MyGenericClass, så att typparametern T kan implementera IComparable-gränssnittet<T>:
offentlig klass MyGenericClass<T> där T:IComparable { }
2. Basklassbegränsning: Anger att en typ måste använda den specificerade klassen som basklass (eller klassen själv) som typparameter för den generiska typen. När en sådan begränsning har använts måste den förekomma före alla andra begränsningar på parametertypen. klassen MyClassy<T, U> där T : klass där U : struct
{
}
3.where-klausulen kan också inkludera konstruktörsbegränsningar. Du kan använda den nya operatorn för att skapa en instans av en typparameter; Men typargumentet måste begränsas av konstruktörbegränsningen new() för detta. New()-begränsningen låter kompilatorn veta att varje typ av argument måste ha en tillgänglig parameterlös (eller standard) konstruktör. Till exempel: offentlig klass MyGenericClass <T> där T: IComparable, new()
{ Följande linje är inte möjlig utan new()-begränsning: T element = ny T();
} New()-begränsningen visas i slutet av where-klausulen.
4. För flera typparametrar använder varje typparameter en where-klausul, Till exempel: gränssnitt MyI { } klassordbok<TKey, TVal> där TKey: IComparabel, IEnumerable där TVal: MyI
{ offentlig tomrum Tillägg (TKey-nyckel, TVal val)
{
}
}
5. Du kan också fästa begränsningar till typparametrar för generiska metoder, såsom:
public bool MyMethod<T>(T t) där T : IMyInterface { }
Observera att syntaxen för att beskriva typparametrbegränsningar är densamma för både delegater och metoder:
delegat T MyDelegate<T>() där T : new()
Generiskt Där
Generisk Var kan kvalificera typparametrar. Det finns flera sätt.
·där T : struct begränsar typparametern T måste ärva från System.ValueType.
·där T: klass begränsar typ Parametern T måste vara en referenstyp, det vill säga den kan inte ärvas från System.ValueType.
där T : new() begränsar typparametern T måste ha en standardkonstruktör
·där T : NameOfClass begränsar typparametern T måste ärva från en klass eller implementera ett gränssnitt.
Dessa kvalificeringar kan kombineras, såsom: offentlig klass Punkt där T: klass, IComparabel, new() |