해결책
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
쉽게 제공 할 수는 없습니다 . 다시 말하지만, 선택적 매개 변수 자체에는 상수가 필요하지만 컴파일러에서 알려진 값이 필요합니다.const
enum