Soru C # olarak öznitelik paramları olarak ondalık değerleri kullanın?


Bir alan özniteliği için ondalık değerleri params olarak kullanmaya çalışıyorum ama derleyici hatası alıyorum.

Bu blog yazısını buldum bağlantı Bunu kullanmak için Net'in mümkün olmadığını söyleyerek, neden bunu seçtiklerini bilen var mı, yoksa ondalık paramları nasıl kullanabilirim?

Teşekkürler.


70
2018-02-03 15:23


Menşei




Cevaplar:


Bu bir CLR kısıtlamasıdır. Özellik parametreleri olarak yalnızca ilkel sabitler veya ilkel diziler kullanılabilir. Nedeni, bir özniteliğin tamamen meta verilerde kodlanması gerektiğidir. Bu, IL'de kodlanmış bir yöntem gövdesinden farklıdır. MetaData'yı kullanmak, yalnızca kullanılabilecek değerlerin kapsamını ciddi biçimde kısıtlar. CLR'nin mevcut sürümünde, meta veri değerleri ilkel, null, ilkel türler ve dizilerle sınırlıdır (küçük olanı kaçırmış olabilir).

Temel bir tür iken, ondalık türler ilkel bir tip değildir ve bu nedenle bir öznitelik parametresi olmasını engelleyen meta verilerde temsil edilemez.


104
2018-02-03 15:26



Bu hala Framework 4.0 ile ilgili bir sorun mu? ve 4.5, 4.6.x? - midspace
@midspace, gerçekten bir sorun değil, tasarımın dayattığı bir sınırlama. Bu talihsiz, ama asla gitmemesi için iyi şanslar. - Bruno Brant
"Sadece ilkel sabitler veya ilkel diziler, öznitelik parametreleri olarak kullanılabilir." Tam olarak doğru görünmüyor, örneğin, System.Type ayrıca izin verilir: 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 böyle? Meta veri, tür 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ü içeren meta veriler yayılır (Her tür, ilkel olmayanlar değil). Bunun neden öznitelikleri için kullanıldığını anlamıyorum. - Winger Sendon


Aynı problemim var. Kullanmayı düşünüyorum Teller. Bu tip güvenli değil, ancak okunabilir ve sanırım dizeleri :-) 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, tüm seçenekleri düşündükten sonra, yeterince iyi.


13
2018-04-23 14:18



MbUnit'in nasıl davrandığı anlaşılıyor vkreynin.wordpress.com/2007/05/25/... - Andy Dent


Bu duruma girdiğimde, öznitelikteki özellikleri Double olarak göstermeyi bitirdim, ancak özniteliğin içinde Ondalık gibi davranıldı. Mükemmel olmaktan uzak ama basit vakalar için ihtiyacınız olan şey olabilir.


2
2017-07-23 16:49





Kullandığım özelliklere sahip gerçek zamanlı püf noktaları için kullanıyorum TypeConverter sınıf.


1
2018-02-04 12:35





Aşağıdaki kurucuyu kullanabilirsiniz. C # kodunda ondalık edebi olduğunuzda, C # derleyicisi bu kurucuya bir çağrı gönderir.

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

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


0
2017-07-23 16:52



Bu bir öznitelikte çalıştıysa, o zaman sadece "m" sonekini kullanacağımı tahmin ediyorum, fakat ne de (System.ComponentModel.DefaultValueAttribute kullanarak benim testim) - xr280xr