C #에서 10 진수 값을 속성 매개 변수로 사용 하시겠습니까?


81

필드 속성에 대한 매개 변수로 십진수 값을 사용하려고했지만 컴파일러 오류가 발생합니다.

.NET에서 사용할 수 없다는 이 블로그 게시물 링크를 찾았습니다. 왜 이것을 선택했는지 또는 십진 매개 변수를 어떻게 사용할 수 있는지 아는 사람이 있습니까?


답변:


121

이것은 CLR 제한 사항입니다. 기본 상수 또는 기본 배열 만 속성 매개 변수로 사용할 수 있습니다. 그 이유는 속성이 메타 데이터로 완전히 인코딩되어야하기 때문입니다. 이것은 IL로 코딩 된 메서드 본문과 다릅니다. MetaData를 사용하면 사용할 수있는 값의 범위가 엄격하게 제한됩니다. 현재 버전의 CLR에서 메타 데이터 값은 프리미티브, null, 프리미티브 유형 및 배열로 제한됩니다 (부족한 값이 누락되었을 수 있음).

기본 유형은 기본 유형이 아니므로 소수는 속성 매개 변수가되는 것을 방지하는 메타 데이터로 표시 할 수 없습니다.


5
여전히 Framework 4.0의 문제입니까? 및 4.5, 4.6.x?
midspace

@midspace는 실제로 문제가 아니라 디자인에 의해 부과 된 제한 일뿐입니다. 불행한 일이지만 결코 사라지지 않을 가능성이 높습니다.
Bruno Brant 2016

1
"기본 상수 또는 기본 배열 만 속성 매개 변수로 사용할 수 있습니다." 예를 들어 System.Type도 허용됩니다. 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-왜 그래? 메타 데이터를 사용하여 유형 정의를 가리킬 수 있습니다. 예를 들어, 일반 클래스에서 필드를 정의하면 필드 이름과 유형 (기본 요소가 아닌 모든 유형)을 포함하는 메타 데이터가 방출됩니다. 왜 이것이 속성에 사용될 수 없는지 이해할 수 없습니다.
Winger Sendon 2017 년

15

나도 같은 문제를 안고있어. 나는 문자열 을 사용하는 것을 고려합니다 . 이것은 유형에 안전하지 않지만 읽을 수 있으며 문자열에 유효한 숫자를 쓸 수 있다고 생각합니다 :-).

class BlahAttribute : Attribute
{
  private decimal value;

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

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

아름다움은 아니지만 모든 옵션을 고려한 후에는 충분합니다.


1
mbUnit이 vkreynin.wordpress.com/2007/05/25/에 대처하는 방식 인 것 같습니다.
Andy Dent

2

이 상황에 처했을 때 속성의 속성을 Double로 노출했지만 속성 내부에서 Decimal처럼 처리했습니다. 완벽 함과는 거리가 멀지 만 간단한 경우에는 필요한 것일 수 있습니다.



0

다음 생성자를 사용할 수 있습니다. C # 코드에 10 진수 리터럴이있는 경우 C # 컴파일러는이 생성자에 대한 호출을 내 보냅니다.

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

편집 : 이것이 편리하지 않다는 것을 알고 있습니다.


2
이 속성에서 일한다면, 나는 것 역시 "m"접미사를 사용하여 간단하게 추측하고있어,하지만도 (내 테스트로 System.ComponentModel.DefaultValueAttribute 사용) 않습니다
xr280xr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.