ondalık değerler c # 'da öznitelik parametreleri olarak kullanılsın mı?


81

Ondalık değerleri bir alan özniteliği için param olarak kullanmaya çalışıyorum, ancak bir derleyici hatası alıyorum.

NET'te kullanmanın mümkün olmadığını söyleyen bu blog gönderisi bağlantısını buldum , neden bunu seçtiklerini veya ondalık paramları nasıl kullanabileceğimi bilen var mı?


Yanıtlar:


123

Bu bir CLR kısıtlamasıdır. Öznitelik parametreleri olarak yalnızca ilkel sabitler veya ilkel diziler kullanılabilir. Bunun nedeni, bir özniteliğin tamamen meta verilerde kodlanması gerektiğidir. Bu, IL'de kodlanan bir yöntem gövdesinden farklıdır. MetaData'nın kullanılması, kullanılabilen değerlerin kapsamını yalnızca ciddi şekilde kısıtlar. CLR'nin mevcut sürümünde, meta veri değerleri ilkel öğeler, boş, türler ve ilkel dizilerle sınırlıdır (küçük bir tanesini atlamış olabilir).

Ondalık sayılar, temel tür ilkel bir tür değildir ve bu nedenle meta verilerde gösterilemez, bu da onun bir öznitelik parametresi olmasını engeller.


5
Bu hala Framework 4.0 ile ilgili bir sorun mu? ve 4.5, 4.6.x?
orta boşluk

@midspace, gerçekten bir sorun değil, sadece tasarım tarafından empoze edilen bir sınırlama. Talihsiz bir durumdur, ancak büyük ihtimalle asla kaybolmayabilir.
Bruno Brant

1
"Yalnızca ilkel sabitler veya ilkel diziler öznitelik parametreleri olarak kullanılabilir." Kesin olarak doğru görünmüyor, örneğin System.Type'a da izin veriliyor: msdn.microsoft.com/en-us/library/aa664615(v=vs.71).aspx
DixonD

Using MetaData only severely restricts the scope of values that can be used- Neden öyle? Meta veriler, yazım tanımlarına işaret etmek için kullanılabilir. Örneğin, normal bir sınıfta bir alan tanımladığınızda, alanın adını ve türünü (Juts ilkelleri değil, herhangi bir tür) içeren meta veriler yayınlanır. Bunun nitelikler için neden kullanılamadığını anlamıyorum.
2017, 13

16

Bende de aynı sorun var. Dizeleri kullanmayı düşünüyorum . Bu tür açısından güvenli değil, ancak okunabilir ve sanırım dizelerde geçerli sayılar yazabileceğiz :-).

class BlahAttribute : Attribute
{
  private decimal value;

  BlahAttribute(string number)
  {
    value = decimal.Parse(number, CultureInfo.InvariantCulture);
  }
}

[Blah("10.23")]
class Foo {}

Bu bir güzellik değil, ancak tüm seçenekleri düşündükten sonra yeterince iyi.


1
Görünüşe göre mbUnit, vkreynin.wordpress.com/2007/05/25/…
Andy Dent

2

Bu durumla karşılaştığımda, öznitelik üzerindeki özellikleri bir Double olarak ortaya çıkardım, ancak özniteliğin içinde onlara Ondalık olarak davrandım. Mükemmel olmaktan uzak, ancak basit durumlarda ihtiyacınız olan şey bu olabilir.



0

Aşağıdaki yapıcıyı kullanabilirsiniz. C # kodunda bir ondalık değişmez değeriniz olduğunda, C # derleyicisi bu yapıcıya bir çağrı yayar.

Decimal(Int32, Int32, Int32, Boolean, Byte)

Düzenleme: Bunun uygun olmadığını biliyorum.


2
Bu bir öznitelikte işe yaradıysa, o zaman sadece "m" sonekini kullanmanın da işe yarayacağını tahmin ediyorum, ancak ikisi de
işe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.