다음 코드는 코드에서 볼 수 있듯이 접미사/접두사 증가 문의 할당으로 인해 예기치 않은 참조가 발생하는 런타임 문제가 있습니다. 또한 누구나 C#에서 값 유형으로 객체를 처리하는 방법을 제안 해 주시겠습니까?C#에서 접두사 및 접미사 연산자 오버로드가 발생했습니다.
나는이 코드가 각 중요 상태를 명확히하는 주석으로 잘 문서화되어 있다고 생각한다. 코드 또는 문제의 명확한 설명과 관련하여 궁금한 점이 있으면 언제든지 문의하십시오.
미리 감사드립니다.
class Test {
public int x;
public Test(int x) { this.x=x; }
public Test() { x=0; }
static public Test operator++(Test obj) {
return new Test(obj.x+1);
}
}
// In implementing module
// Prefix/Postfix operator test for inbuilt (scalar) datatype 'int'
int x=2;
int y=++x; // 'y' and 'x' now both have value '3'
Console.WriteLine(x++); // Displays '3'
Console.WriteLine(++x); // Displays '5'
Console.WriteLine(ReferenceEquals(x,y)); // Displays 'False'
// Prefix/Postfix operator test of class type 'Test'
Test obj=new Test();
obj.x=1;
Console.WriteLine(obj++); // Must have displayed '1', displays the object type (Test.Test)
Console.WriteLine(++obj); // Must have displayed '3', again displays the object type (Test.Test)
Console.WriteLine(obj.x); // Displays '3' (as expected)
Test obj2=++obj; // Must have the value '4' and must NOT be the reference of obj
// Alternative solution to the above statement can be : 'Test obj2=new Test(++obj);' but isn't there a way to create a new value type in C# by the above statement ??!! (In C++, it can be acheived by overloading the '=' operator but C# doesn't allow it)
Console.WriteLine(obj2.x); // Displays '4' (as expected)
Console.WriteLine(ReferenceEquals(obj,obj2)); // Must display 'False' but displays 'True' showing that 'obj2' is the reference of 'obj'
네 음, ToString()을 오버 라이딩하지 않았습니다. 그 시점에서 이의 제기의 절반이 사라집니다. * single * 문제를 시연하는 [mcve]를 쓰면 정말 도움이 될 것입니다. –
@ user3185569 : 나는 그 의견을 삭제했다. 'obj'와'obj2'에 대한 부분이 괜찮을 것 같아서요 ... 여기에 많은 문제가 얽혀있는 것은 도움이되지 않습니다. –
사실, 'Test obj2 = ++ obj' 부분의 문제점을 봅니다. 그것에 대한 답을 추가 할 것입니다. –