Aracılığıyla paylaş


Genişletilmiş nameof kapsamı

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, dil tasarımı toplantısınınilgili notlarında kayıt altına alınır.

Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek içinbelirtimleri makalesinde bulabilirsiniz.

Şampiyon sorunu: https://github.com/dotnet/csharplang/issues/373

Özet

Bir yöntem veya parametredeki bir öznitelik içinde nameof(parameter)'a izin verin. Örneğin:

  • [MyAttribute(nameof(parameter))] void M(int parameter) { }
  • [MyAttribute(nameof(TParameter))] void M<TParameter>() { }
  • void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }

Motivasyon

NotNullWhen veya CallerExpression gibi özniteliklerin parametrelere başvurması gerekir, ancak bu parametreler şu anda kapsam içinde değildir.

Ayrıntılı tasarım

Yöntemleri

yöntemin type_parameters, method_declarationkapsamı içinde yer alır ve bu kapsamda, return_type, method_bodyve type_parameter_constraints_clauses içinde türler oluşturmak için kullanılabilir. Ancaközniteliklerindeki bir ifade dışında,özniteliklerinde kullanılamaz.

Yöntemi parametreleri

Yöntem bildirimi parametreler, tür parametreleri ve yerel değişkenler için ayrı bir bildirim alanı oluşturur. Adlar, türü parametre listesi ve yöntemin resmi parametre listesi ve yöntemin bloğundaki yerel değişken bildirimleri tarafından bu bildirim alanına eklenir. İsimler, yöntemin veya parametrelerinin üzerinde belirtilen niteliklerdeki nameof ifadelerinde, yöntemin tür parametre listesi ve formal parametre listesi aracılığıyla bu bildirim alanına tanıtılır.

[...]
Bir yöntemin bloğunda, simple_name ifadelerde (Basit adlar) tanımlayıcıları tarafından resmi parametrelere başvurulabilir. Yöntem veya parametrelerine yerleştirilen özniteliklerdeki bir nameof ifadesinde, resmi parametrelere simple_name ifadelerindeki tanımlayıcıları ile başvurulabilir.

Anonim işlev imzaları

Anonim işlevin parametrelerinin kapsamı, anonim işleve veyaparametrelerine yerleştirilen özniteliklerdeki anonymous_function_body (§7.7) ve ifadeleridir.

temsilci bildirimleri

nameofparametrelerine yerleştirilen özniteliklerdeki ifadeler .

Basit adlar

simple_name, I tek bir tanımlayıcı ve I<A1,...,Ak> isteğe bağlı bir Iolduğu <A1,...,Ak> biçiminde veya biçimindedir. hiçbir type_argument_list belirtilmediğinde, K sıfır olarak düşünün. simple_name değerlendirilir ve aşağıdaki gibi sınıflandırılır:

  • K sıfırsa ve simple_name bir bloğun içinde görünüyorsa ve bloğun (veya kapsayan bloğun) yerel değişken bildirim alanı (Bildirimler) adı Iolan bir yerel değişken, parametre veya sabit içeriyorsa, simple_name bu yerel değişkene, parametreye veya sabite başvurur ve değişken veya değer olarak sınıflandırılır.
  • K sıfırsa ve simple_name genel yöntem bildiriminin gövdesinde görünüyorsa ve bu bildirim Iadlı bir tür parametresi içeriyorsa, simple_name bu tür parametresine başvurur.
  • K sıfırsa ve simple_name yöntem bildirimindeki veya parametrelerindeki öznitelikteki bir nameof ifadesi içinde görünüyorsa ve bu bildirimde adı Iolan bir parametre veya tür parametresi varsa, simple_name bu parametreye veya tür parametresine başvurur.
  • Aksi takdirde, her örnek türü için şu şekilde işlem yapılır: Öncelikle, hemen kapsayan tür bildiriminin örnek türünden başlanır ve varsa, her bir kapsayan sınıf veya yapı bildiriminin örnek türüyle devam edilir. Bu işlem, T (Örnek türü) ile gerçekleştirilir.
    [...]
  • Aksi takdirde, Niçin, simple_name'nin oluştuğu ad alanıyla başlayan, her kapsayıcı ad alanını (varsa) takip eden ve küresel ad alanıyla biten her ad alanı için bir varlık bulunana kadar aşağıdaki adımlar değerlendirilir:
    [...]
  • Aksi takdirde, simple_name tanımlanmamıştır ve derleme zamanı hatası oluşur.

Kapsamlar

  • type_parameter_list ile bildirilen bir tür parametresinin kapsamı, yöntem bildiriminde veya parametrelerinin özniteliklerinde geçen ve nameof ifadeleridir.
  • bir method_declaration (Yöntemler) içinde bildirilen bir parametrenin kapsamı, yöntem bildiriminde veya parametrelerindeki bir öznitelikte bu method_declaration ve ifadelerinin nameof.