2017-10-30 20 views
-1

new 연산을 값 유형과 함께 사용할 수 있습니까? 새 연산을 C#의 값 형식과 함께 사용할 수 있습니까?

int i = new int(3); 

컴파일되지 않습니다

,

int i = new int(); 

동안 캔.

왜 궁금한가요?

+0

https : // stack overflow.com/questions/5746873/where-and-why-use-int-a-new-int – Eric

+4

생성자가 매개 변수를 허용하지 않기 때문에 –

답변

5

"값 유형"— 심지어 — 프리미티브가 단지 struct입니다. 구조체에 대해 생성자를 정의하고 호출 할 수 있습니다. int 유형에는 값을 허용하는 생성자 오버로드가 없습니다. 이

int i = new int(); 

처럼 사용

+0

감사합니다. C++에서 우리는'new'를'int'와 함께 사용할 수도 있습니다.'int'는 생성자를 가집니까? – Ben

+0

나는 2007 년과 그 2002 년 전에 잠깐 C++을 사용하지 않았다. 나는 그것을 찾아야 만했을 것이다. –

+0

int는 C#을 모든 구조체로 갖는 struct 인 System.Int32의 별칭이다. Sysem.Int32의 경우, ctor는 코드가 아니라 컴파일러에 의해 암시 적으로 정의됩니다. ctor를 선언하지 않으면 클래스/구조체에 대해 C++에서 발생합니다. System.Int32에 대한 [.Net 소스 코드] (https://referencesource.microsoft.com/#mscorlib/system/int32.cs)를 참조하십시오. C#에는 클래스 (참조 형식)와 구조체 (값 형식) 사이에 큰 차이가 있음에 유의하십시오. –

1

는 퍼팅

int i = 0; 

과 동일한 3int()() 안의 INT를 사용하여 그것을 기본 값을 제공하기 때문에, 그것에게 가치를 제공 할 수없는 것 . 구조체 형식의

생성자는 클래스 생성자와 유사하지만, 하나는 컴파일러에 의해 자동적으로 을 제공하기 때문에 구조체 는 명시 적 기본 생성자를 포함 할 수 없습니다. 이 생성자는 구조체의 각 필드 을 기본값으로 초기화합니다.

0

System.Int32 유형 (실제로는 int)에는 인수를 취하는 생성자가 없습니다. 이것을 증명할 수 있습니다

//Error: Constructor on type 'System.Int32' not found. 
var instance = Activator.CreateInstance(typeof(Int32), new [] {0}); 

그러나 여전히 인수없이 인스턴스화 할 수 있습니다.

var instance = Activator.CreateInstance(typeof(Int32)); 

또는 두 단지

var instance = new Int32(); 

은 당신이 정말로 new(value) 구문을 사용 죽어 경우, 당신은 항상 자신의 값 유형을 만들 수 있습니다

var instance = default(int); 

에 동일합니다

struct MyInt 
{ 
    int _val; 
    public MyInt(int val) 
    { 
     _val = val; 
    } 

    static public implicit operator int(MyInt input) 
    { 
     return input._val; 
    } 
} 

int i = new MyInt(32); //Note the implicit cast 
Console.WriteLine(i); //outputs "32"