2010-06-29 2 views
6

같은 방법 파라미터 디폴트 값은 어레이로서 (예를위한 문자열 [] sArray.) C# 4.0있어서 디폴트 파라미터 값에서 가능한가? 예인 경우 구현 방법은 무엇입니까? C# 4.0 배열

나는 통화 기능 아래와 같이 시도 :

MethodA(string[] legends=new string[]{"a","b"},float[] values=new float[]{1,2}, string alt="sd"); 

컴파일 타임 상수, 배열을 사용할 수 없습니다 의미해야

답변

10

, 기본 값은 배열이 될 수 없습니다.

public void Foo(int[] x = null) 
{ 
    x = x ?? new int[] { 5, 10 }; 
} 

아니면 배열 변이 또는 발신자에 노출하지 않을거야 경우 :

그러나,이 문제를 피하는 방법 중 하나는 기본 null 값을 확인한 다음 필요한 경우 배열을 초기화하는 것입니다 이 null 가정
private static readonly int[] FooDefault = new int[] { 5, 10 }; 
public void Foo(int[] x = null) 
{ 
    x = x ?? FooDefault; 
} 

주 당신이 어떤 다른 이유로 사용할 거라고 값이 아닙니다. 세계적으로 적용 가능한 아이디어는 아니지만 컴파일 타임 상수로 기본값을 표현할 수없는 경우에는 잘 작동합니다. Encoding.UTF8 같은 것을 기본 인코딩으로 사용할 수 있습니다.

당신이 값 형식 매개 변수를 원하는 경우에, 당신은 단지 null 허용 한 것을 할 수 있습니다. 예를 들어, 매개 변수의 기본값을 컴파일 타임 상수가 아닌 컴파일 타임 정수로 기본 설정하려고한다고 가정합니다.

public void RunInParallel(int? cores = null) 
{ 
    int realCores = cores ?? Environment.ProcessorCount; 
} 
3

기본값을 작동 아니에요.

  • 일정한 표현을
  • 의 식을 :

    기본 인수의 표현은 다음 중 하나 여야합니다

    규격 (페이지 312)이 말한다 형식 S() 여기서 S는 값 형식

  • 형식 기본값의 표현 (S) 여기서 S는 값 형식입니다.
다른 사람이 말했듯이
+0

오우 와우는 참혹합니다. 그것은 당신이 실제로 배열을 사용할 수 있다는 것을 제외하고는 속성과 동일한 문제입니다. 초기화 된 배열을 선언 할 수없는 이유는 무엇입니까? 그것들은 일정합니다. –

+1

@Graphain : 어떤 점에서 빈 배열이 아닌 다른 배열이 있습니까? 비어 있지 않은 배열은 항상 변경 가능합니다. 컴파일러는 무언가 (예 : 호출 된 메소드)가 내용을 변경 한 경우 각 호출에서 배열의 복사본을 만들어야합니다. –

+0

@ 존 스키트 - 글쎄요. 기본값으로 상수가 필요하다면 컴파일러는 배열을 읽기 전용으로 처리 할만큼 똑똑하다고 생각할 것입니다. 변화하는 유일한 방법은 누군가가 반성 할 수있는 권리를 부여하는 경우이며, 이는 실제 상수 (예 : 문자열 등)에 대해 동일한 문제 일 수 있습니다. –