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

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

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



답변

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

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


답변

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

class BlahAttribute : Attribute
{
  private decimal value;

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

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

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


답변

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


답변

속성이있는 실시간 트릭의 경우 TypeConverter 클래스를 사용하고 있습니다.


답변

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

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

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


답변