무엇을 반환할 수 있고 무엇을 반환할 수 없는지에 대한 내용에 더하여 추가적인 제약 사항도 있다. 참조 반환은 비동기 메서드에서는 사용할 수 없고, 이터레이터 블록에서도 사용할 수 없다. 그리고 포인터 타입과 마찬가지로 타입 인수 내에서는 ref 한정자를 사용할 수 없다. 하지만 인터페이스나 델리게이트 선언 시에는 여전히 ref 한정자를 사용할 수 있다. 즉, Func<ref int>라고는 쓸 수 없지만, 다음과 같이 코드를 쓸 수 있다.
delegate ref int RefFuncInt32();
참조 반환을 반드시 참조 지역 변수와 함께 사용해야 하는 것은 아니다. 그리고 참조 반환을 통해 반환되는 결과에 대해 단일한 연산을 바로 사용할 수 있다. 다음 예제는 13-6과 동일한 코드이지만 참조 지역 변수를 사용하지 않았다.
예제 13-7 참조 반환을 통해 반환된 결과에 증가 연산을 바로 사용 ▶ RefReturnSimpleNoLocal.cs
static void Main()
{
int x = 10;
RefReturn(ref x)++; ----- 반환된 변수의 값을 바로 증가시킴
Console.WriteLine(x);
}
static ref int RefReturn(ref int p)
{
return ref p;
}