Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Jegyzet
Ez a cikk egy funkcióspecifikáció. A specifikáció a funkció tervezési dokumentumaként szolgál. Tartalmazza a specifikáció javasolt módosításait, valamint a funkció tervezése és fejlesztése során szükséges információkat. Ezeket a cikkeket mindaddig közzéteszik, amíg a javasolt specifikációmódosításokat nem véglegesítik, és be nem építik a jelenlegi ECMA-specifikációba.
A szolgáltatás specifikációja és a befejezett implementáció között eltérések lehetnek. Ezeket a különbségeket a vonatkozó nyelvi tervezési értekezlet (LDM) megjegyzései rögzítik.
A funkcióspektusok C# nyelvi szabványba való bevezetésének folyamatáról a specifikációkcímű cikkben olvashat bővebben.
Bajnoki probléma: https://github.com/dotnet/csharplang/issues/3297
Összefoglalás
Null értékű széljegyzetek engedélyezése olyan típusparaméterekhez, amelyek nincsenek értéktípusokra vagy hivatkozástípusokra korlátozva: T?.
static T? FirstOrDefault<T>(this IEnumerable<T> collection) { ... }
? megjegyzés
A C#8-ban ? széljegyzetek csak olyan típusparaméterekre alkalmazhatók, amelyek kifejezetten értéktípusokra vagy hivatkozástípusokra voltak korlátozva.
A C#9-ben ? széljegyzetek bármilyen típusparaméterre alkalmazhatók, a korlátozásoktól függetlenül.
Ha egy típusparaméter nincs kifejezetten értéktípusokra korlátozva, a széljegyzetek csak #nullable enable környezetben alkalmazhatók.
Ha egy T típusparaméter hivatkozástípussal van helyettesítve, akkor a T? az adott referenciatípus null értékű példányát jelöli.
var s1 = new string[0].FirstOrDefault(); // string? s1
var s2 = new string?[0].FirstOrDefault(); // string? s2
Ha T értéktípussal helyettesít, akkor T? a Tegy példányát jelöli.
var i1 = new int[0].FirstOrDefault(); // int i1
var i2 = new int?[0].FirstOrDefault(); // int? i2
Ha T helyére egy annotált U?kerül, akkor T?U?helyett az annotált típust U?? jelöli.
var u1 = new U[0].FirstOrDefault(); // U? u1
var u2 = new U?[0].FirstOrDefault(); // U? u2
Ha T egy Utípussal helyettesít, akkor T?U?jelöl, még egy #nullable disable környezetben is.
#nullable disable
var u3 = new U[0].FirstOrDefault(); // U? u3
Visszatérési értékek esetén a T? egyenértékű a [MaybeNull]T; argumentumértékek esetén T? egyenértékű a [AllowNull]T.
Az egyenértékűség akkor fontos, ha egy C#8-tal összeállított szerelvény interfészeit felül kell bírálni vagy implementálni.
public abstract class A
{
[return: MaybeNull] public abstract T F1<T>();
public abstract void F2<T>([AllowNull] T t);
}
public class B : A
{
public override T? F1<T>() where T : default { ... } // matches A.F1<T>()
public override void F2<T>(T? t) where T : default { ... } // matches A.F2<T>()
}
default kényszer
A meglévő kóddal való kompatibilitás érdekében, ahol a felülírt és explicit módon implementált általános metódusok nem tartalmazhatnak explicit korlátozó záradékokat, a felülírt vagy explicit implementált metódusokban T?Nullable<T>-ként van kezelve, ha a T értéktípus.
A referenciatípusokra korlátozott típusparaméterek annotációinak engedélyezéséhez a C#8 explicit where T : class és where T : struct korlátozásokat engedélyezett a felülbírált vagy explicit módon implementált metódusokra vonatkozóan.
class A1
{
public virtual void F1<T>(T? t) where T : struct { }
public virtual void F1<T>(T? t) where T : class { }
}
class B1 : A1
{
public override void F1<T>(T? t) /*where T : struct*/ { }
public override void F1<T>(T? t) where T : class { }
}
Ha olyan típusparaméterek megjegyzéseit szeretné engedélyezni, amelyek nincsenek hivatkozástípusokra vagy értéktípusokra korlátozva, a C#9 új where T : default korlátozást tesz lehetővé.
class A2
{
public virtual void F2<T>(T? t) where T : struct { }
public virtual void F2<T>(T? t) { }
}
class B2 : A2
{
public override void F2<T>(T? t) /*where T : struct*/ { }
public override void F2<T>(T? t) where T : default { }
}
Hiba, ha nem metódus-felülbíráláson vagy explicit megvalósításon alapuló default kényszert használ.
A default kényszer használata akkor hiba, ha a felülírt vagy interfész módszer megfelelő típusparamétere hivatkozástípusra vagy értéktípusra van korlátozva.
Tervezési értekezletek
C# feature specifications