[C#] C #에서 Guid.Empty로 매개 변수를 기본값으로 설정하는 방법은 무엇입니까?

나는 말하고 싶다 :

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


답변

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);
}


답변