해결책
new Guid()대신 사용할 수 있습니다
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
당신은 또한 사용할 수 있습니다 default(Guid)
default(Guid) 또한 정확히 작동합니다 new Guid() .
Guid는 참조 유형이 아닌 값 유형이므로 default(Guid)같지 않습니다.null 예를 들어, 대신, 그것은 기본 생성자를 호출 동일합니다.
이는 다음을 의미합니다.
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
원래 예제와 정확히 동일합니다.
설명
왜 안했어 Guid.Empty 작동 않습니까?
오류가 발생하는 이유 Empty는 다음과 같이 정의 되기 때문 입니다.
public static readonly Guid Empty;
그래서, 그것은으로 정의 된 변수가 아닌 상수 (인 static readonly하지가const ). 컴파일러는 컴파일러에서 알려진 값만 메소드 매개 변수 기본값으로 지정할 수 있습니다 (런타임 전용은 아님).
근본 원인은 당신이 가질 수 없다는 것입니다 const모든의를 struct달리enum 예를 들어. 시도하면 컴파일되지 않습니다.
한 번 더 이유 struct는 기본 유형이 아닙니다.
.NET의 모든 원시 유형의 목록을 참조 http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(참고 enum일반적으로 상속 int원시적이다)
그러나 new Guid()상수도 아닙니다!
상수가 필요하다는 말은 아닙니다. 컴파일 타임에 결정할 수있는 것이 필요합니다. Empty필드이므로 필드 값은 컴파일 타임에 알려지지 않았습니다 (런타임의 맨 처음에만).
기본 매개 변수 값이 될 수있는, 컴파일시에 알려 져야 const값, 또는 뭔가처럼 컴파일 타임에 알려진 값을 만드는 C 번호 기능을 사용하여 정의 default(Guid)나 new Guid()에 대해 컴파일시에 결정된다 ( struct당신은 수정할 수 없습니다로의struct 에서 생성자 암호).
기본 유형이 아니거나 위에서 설명한 것과 같지 않기 때문에 제공 default하거나 new쉽게 제공 할 수는 없습니다 . 다시 말하지만, 선택적 매개 변수 자체에는 상수가 필요하지만 컴파일러에서 알려진 값이 필요합니다.constenum