나는 말하고 싶다 :
public void Problem(Guid optional = Guid.Empty)
{
}
그러나 컴파일러는 Guid.Empty가 컴파일 시간 상수가 아니라고 불평합니다.
API를 변경하고 싶지 않으므로 사용할 수 없습니다.
Nullable<Guid>
답변
해결책
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
답변
Guid.Empty
는에 해당하며 new Guid()
, 이는에 해당합니다 default(Guid)
. 따라서 다음을 사용할 수 있습니다.
public void Problem(Guid optional = default(Guid))
또는
public void Problem(Guid optional = new Guid())
다음과 같은 new Foo()
경우 에만 값을 적용 할 수 있습니다.
- 실제로 매개 변수가없는 생성자를 호출하고 있습니다.
Foo
가치 유형
즉, 컴파일러가 알면 실제로 유형의 기본값 일뿐입니다. 🙂
(재미있게 말하면 99.9 % 가 생성 한 사용자 정의 생성자를 호출하지 않을 것이라고 확신합니다 new Foo()
. C #에서는 값 유형으로 이러한 생성자를 만들 수 없지만 IL에서는 그렇게 할 수 있습니다 .)
모든 유형 의 default(Foo)
옵션을 사용할 수 있습니다 .
답변
사용할 수 없습니다 :
default ( Guid )
?
답변
수락 된 답변이 ASP.NET MVC에서 작동하지 않으며이 런타임 오류가 발생합니다.
[ArgumentException: The parameters dictionary contains a null entry for parameter 'optional' of non-nullable type 'System.Guid' for method 'System.Web.Mvc.ActionResult Problem(System.Guid)' ....
대신 다음을 수행 할 수 있습니다.
public void Problem(Guid? optional)
{
if (optional == null)
{
optional = new Guid();
}
}
답변
컴파일러는 매우 정확합니다. Guid.Empty
컴파일 타임 상수가 아닙니다. 다음과 같이 메소드 과부하를 시도 할 수 있습니다.
public void Problem()
{
Problem(Guid.Empty);
}