2009-02-03 7 views
63

필드 속성에 대해 params로 십진수 값을 사용하려고했지만 컴파일러 오류가 발생합니다.10 진수 값을 C#의 특성 매개 변수로 사용 하시겠습니까?

나는이 블로그 게시물 link을 사용하여 .Net에서 사용할 수 없다고 말하면서 누가 이것을 선택했는지 또는 어떻게 10 진수 매개 변수를 사용할 수 있는지 알 수 있습니까?

감사합니다.

답변

92

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

기본 유형은 기본 유형이 아니므로 메타 데이터에 표시 할 수 없으므로 속성 매개 변수가 될 수 없습니다.

+0

고마워요, 난 decimal 원시적 인 유형이라고 생각 :-) – rjlopes

+2

이것은 여전히 ​​Framework 4.0과 관련된 문제입니까? 및 4.5, 4.6.x? – midspace

+0

@midspace, 정말 문제는 아니며 단지 제한으로 설계되었습니다. 불행한 일이지만 절대로 떠나지 않을 수도 있습니다. –

1

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

2

이 상황에 직면했을 때 속성의 속성이 Double로 표시되지만 결국 속성이 Decimal처럼 처리됩니다. 완벽하지는 않지만 간단한 경우에는 필요한 것일 수 있습니다.

0

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

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

편집 :이 편리하지 알고있다.

+1

이 속성에서 작동하는 경우 "m"접미사를 사용하는 것만으로도 추측 할 수 있지만 둘 다 사용하지 않습니다 (System.ComponentModel.DefaultValueAttribute를 내 테스트로 사용). – xr280xr

13

동일한 문제가 있습니다. 나는 문자열을 사용하는 것을 고려한다. 이 형식은 안전하지 않지만 읽을 수 있으며 문자열에 유효한 숫자를 쓸 수 있다고 생각합니다.

class BlahAttribute : Attribute 
{ 
    private decimal value; 

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

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

모든 옵션을 고려한 후에는 좋지 않습니다.

+1

mbUnit이 http : // vkreynin을 어떻게 처리하는지 보입니다. wordpress.com/2007/05/25/mbunit-24-rtm-now-you-can-use-decimals-in-row-attributes/ –