Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not
Bu makale bir özellik belirtimidir. Belirtim, özelliğin tasarım belgesi olarak görev alır. Önerilen belirtim değişikliklerini ve özelliğin tasarımı ve geliştirilmesi sırasında gereken bilgileri içerir. Bu makaleler, önerilen belirtim değişiklikleri son haline getirilene ve geçerli ECMA belirtimine dahil edilene kadar yayımlanır.
Özellik belirtimi ile tamamlanan uygulama arasında bazı tutarsızlıklar olabilir. Bu farklılıklar, ilgili dil tasarım toplantısı (LDM) notlarındakaydedilir.
Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek için belirtimleri makalesinde bulabilirsiniz.
Şampiyon sorunu: https://github.com/dotnet/csharplang/issues/3297
Özet
Değer türleri veya başvuru türleriyle kısıtlanmamış tür parametreleri için null'a atanabilir ek açıklamalara izin ver: T?.
static T? FirstOrDefault<T>(this IEnumerable<T> collection) { ... }
? ek açıklaması
C#8'de ? ek açıklamaları yalnızca değer türleri veya başvuru türleriyle açıkça kısıtlanmış tür parametrelerine uygulanabilir.
C#9'da ? ek açıklamalar, kısıtlamalardan bağımsız olarak herhangi bir tür parametresine uygulanabilir.
Tür parametresi açıkça değer türleriyle kısıtlanmadığı sürece, ek açıklamalar yalnızca #nullable enable bağlam içinde uygulanabilir.
Bir tür parametresi T yerine başvuru tipi kullanıldığında, T? bu başvuru tipinin null değer alabilir bir örneğini temsil eder.
var s1 = new string[0].FirstOrDefault(); // string? s1
var s2 = new string?[0].FirstOrDefault(); // string? s2
T bir değer türüyle değiştirilirse, T?Törneğini temsil eder.
var i1 = new int[0].FirstOrDefault(); // int i1
var i2 = new int?[0].FirstOrDefault(); // int? i2
T
U?açıklamalı bir türle değiştirilirse, T?U?yerine ek açıklamalı tür U?? temsil eder.
var u1 = new U[0].FirstOrDefault(); // U? u1
var u2 = new U?[0].FirstOrDefault(); // U? u2
T
Utürüyle değiştirilirse, T?U? bağlam içinde bile #nullable disabletemsil eder.
#nullable disable
var u3 = new U[0].FirstOrDefault(); // U? u3
dönüş değerleri için T?[MaybeNull]Teşdeğerdir; bağımsız değişken değerleri için T?[AllowNull]Teşdeğerdir.
C#8 ile derlenmiş bir derlemeden arabirimleri geçersiz kılma veya uygulama sırasında denklik önemlidir.
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ısıtlaması
Mevcut kodda geçersiz kılınan ve açıkça uygulanan genel yöntemlerde açık kısıtlama yan tümceleri yer alamadığından uyumluluk sağlamak için, geçersiz kılınan veya açıkça uygulanan bir yöntemde T?, Nullable<T> bir değer türü olduğunda T olarak değerlendirilir.
C#8, başvuru türleriyle kısıtlanmış tür parametreleri için ek açıklamalara izin vermek için geçersiz kılınan veya açıkça uygulanan yöntemde açık where T : class ve where T : struct kısıtlamalarına izin verdi.
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 { }
}
C#9, başvuru türlerine veya değer türlerine kısıtlanmamış tür parametreleri için ek açıklamalara izin vermek için yeni bir where T : default kısıtlamasına izin verir.
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 { }
}
Yöntem geçersiz kılma veya açık uygulama dışında bir default kısıtlaması kullanmak bir hatadır.
Geçersiz kılınan veya arabirim yöntemindeki karşılık gelen tür parametresi bir başvuru türü ya da değer türüyle sınırlandırıldığında, default kısıtlaması yapılması hatadır.
Tasarım toplantıları
C# feature specifications