2009-03-30 3 views
2

저는 C#을 자습 중이며 다음과 같은 정보를 제공합니다 :C# generics 이해에 도움이 필요합니다.

1.21.4. 일반 매개 변수 선언 일반 매개 변수는 클래스, 구조체, 인터페이스, 대리자 (곧 나오는 "대리인"절 참조) 및 메서드 선언에 도입 할 수 있습니다. 속성과 같은 다른 구문은 일반 매개 변수를 도입 할 수 없지만 일반 매개 변수를 사용할 수 있습니다. 예를 들어, 속성 값은 T 사용

public struct Nullable<T> 
{ 
    public T Value {get;} 
} 

첫째, 나는 오류이 그것입니다 둘 다 있기 때문에 몸을 포함해야한다는 말을 컴파일하려고 얻을 추상도 통근자 또는 자동 매개 변수가 모두 받아야합니다 및 설정 접근 자.

둘째로, 틀렸다고 가정하고 "set;"을 추가하여 문제를 해결했습니다. 성공적으로 호출을 포맷 할 수 없습니다.

답변

2

Nullable이 프레임 워크 구조체이므로 구조체 이름에 나쁜 예제를 선택했는지는 확실하지 않지만 그렇지 않은 경우에는 속성에 접근 자 설정이 없기 때문에 오류가 발생합니다. 자동 속성 (C# 3.0에 추가됨)에는 get 및 set 속성이 모두 필요합니다. 따라서 코드를 다음과 같이 변경하면

public struct Nullable<T> 
{ 
    public T Value {get; set; } 
} 

으로 변경해야합니다. 이 경우 오류는 제네릭과 아무 관련이 없습니다. 인스턴스를 만들려면 다음을 사용할 수 있습니다.

Nullable<int> i = new Nullable<int>(); 

이렇게하면 컴파일됩니다. 그러나 Jon과 Cerebrus 모두 지적했듯이 제네릭의 작동을 보여주는 예일뿐입니다.

+0

예제는 책에서 직접 복사되었습니다. 나는 "세트;" 실종되었다. 그러나 그들은 전화를 보여주지 않았다. 메서드에 액세스하려는 다양한 시도에서 방정식의 왼쪽에 이 누락되었습니다. 이 대답은 바로 그 문제를 해결했습니다. 감사! – Rodddgers

8

구현보다 API가 Nullable<T> 인 것으로 나타났습니다. 컴파일 할 의도가 없습니다. System.Nullable<T>이 프레임 워크의 일부이므로 직접 구현할 필요가 없습니다.

3

"C# 3.0 in a Nutshell"을 읽는 것으로 보입니다. 음, 예제는 바로 그 예입니다 - 예. 일반 Nullable 클래스의 Value 속성이 포함 된 형식으로 선언 된 제네릭 매개 변수를 노출하는 방법을 설명하기위한 것입니다.

이것은 컴파일 가능한 예제의 일부가 아닙니다.

0

여기에 귀하의 질문은 제네릭이 아닌 자동 속성 인 것으로 보입니다. 당신은 생성자에 세트를 호출 할 수 있습니다

public T Value { get; private set; } 

:

public Nullable (T value) { 
    Value = value; 
} 
는 GET과 같은 가시성을 확보하지 않지만

자동 특성은 세트 접근이 있어야합니다

이 경우 구조체를 다루고 있지만, 항상 기본 (매개 변수없는) 생성자를가집니다. 구조체와 자동 속성에 대해서는 좀 더주의해야합니다.

는 .NET에서 널 (NULL) 일반적인 이미있다 :

Nullable<int> i = GetCounterThatMightBeNull(); 

int j = 0; 
if(i.HasValue) 
    j = i.Value; 
... 

이가에서 추가되었다.(제네릭과 동시에) 2 순, 그들은 그것을 최종 버전 간소화 위의 초기 베타 코드처럼 보였다 동안 : 당신은 항상 getter 및 setter 모두 필요 자동 속성에 대해

//int? is shorthand for Nullable<int> 
int? i = GetCounterThatMightBeNull(); 

// ?? is shorthand for the null check 
int j = i ?? 0; 

//or 
if(i == null) { 
    //this works even though Nullable<int> is a struct 
} 
1

합니다. getter가 없으면 값을 설정할 수 있지만 아무것도 검색 할 수는 없습니다. 설정자가 없으면 아무 것도 설정할 수 없으므로 값은 항상 기본값입니다.

//tradition 
private T _value; 
public T Value 
{ 
    get 
    { 
     return _value; 
    } 
} 
//locally, _value can always be set 

//Auto-matically implemented property 
public T Value { get; } 
//there is never a way to set it 

//with this it can be privately set, but is get only to everyone else 
public T Value{ get; private set; } 
관련 문제