필드 속성에 대한 매개 변수로 십진수 값을 사용하려고했지만 컴파일러 오류가 발생합니다.
.NET에서 사용할 수 없다는 이 블로그 게시물 링크를 찾았습니다. 왜 이것을 선택했는지 또는 십진 매개 변수를 어떻게 사용할 수 있는지 아는 사람이 있습니까?
답변:
이것은 CLR 제한 사항입니다. 기본 상수 또는 기본 배열 만 속성 매개 변수로 사용할 수 있습니다. 그 이유는 속성이 메타 데이터로 완전히 인코딩되어야하기 때문입니다. 이것은 IL로 코딩 된 메서드 본문과 다릅니다. MetaData를 사용하면 사용할 수있는 값의 범위가 엄격하게 제한됩니다. 현재 버전의 CLR에서 메타 데이터 값은 프리미티브, null, 프리미티브 유형 및 배열로 제한됩니다 (부족한 값이 누락되었을 수 있음).
기본 유형은 기본 유형이 아니므로 소수는 속성 매개 변수가되는 것을 방지하는 메타 데이터로 표시 할 수 없습니다.
Using MetaData only severely restricts the scope of values that can be used
-왜 그래? 메타 데이터를 사용하여 유형 정의를 가리킬 수 있습니다. 예를 들어, 일반 클래스에서 필드를 정의하면 필드 이름과 유형 (기본 요소가 아닌 모든 유형)을 포함하는 메타 데이터가 방출됩니다. 왜 이것이 속성에 사용될 수 없는지 이해할 수 없습니다.
나도 같은 문제를 안고있어. 나는 문자열 을 사용하는 것을 고려합니다 . 이것은 유형에 안전하지 않지만 읽을 수 있으며 문자열에 유효한 숫자를 쓸 수 있다고 생각합니다 :-).
class BlahAttribute : Attribute
{
private decimal value;
BlahAttribute(string number)
{
value = decimal.Parse(number, CultureInfo.InvariantCulture);
}
}
[Blah("10.23")]
class Foo {}
아름다움은 아니지만 모든 옵션을 고려한 후에는 충분합니다.
속성이있는 실시간 트릭의 경우 TypeConverter 클래스를 사용하고 있습니다.
다음 생성자를 사용할 수 있습니다. C # 코드에 10 진수 리터럴이있는 경우 C # 컴파일러는이 생성자에 대한 호출을 내 보냅니다.
Decimal(Int32, Int32, Int32, Boolean, Byte)
편집 : 이것이 편리하지 않다는 것을 알고 있습니다.