코드 검토 중에 실수로 함수에서 한 줄을 주석 처리 할 때 코드에서 기괴한 동작을 발견했습니다. 재현하기는 매우 어려웠지만 여기서는 비슷한 예를 보여 드리겠습니다.
이 테스트 클래스가 있습니다.
public class Test
{
public void GetOut(out EmailAddress email)
{
try
{
Foo(email);
}
catch
{
}
}
public void Foo(EmailAddress email)
{
}
}
GetOut일반적으로 오류가 발생하는 이메일에 할당이 없습니다 .
제어가 현재 메소드를 떠나기 전에 out 매개 변수 'email'을 지정해야합니다.
그러나 EmailAddress가 별도 어셈블리의 구조체에 있으면 오류가 생성되지 않고 모든 것이 잘 컴파일됩니다.
public struct EmailAddress
{
#region Constructors
public EmailAddress(string email)
: this(email, string.Empty)
{
}
public EmailAddress(string email, string name)
{
this.Email = email;
this.Name = name;
}
#endregion
#region Properties
public string Email { get; private set; }
public string Name { get; private set; }
#endregion
}
컴파일러가 이메일을 할당해야하는 이유는 무엇입니까? 구조체가 별도의 어셈블리에서 생성 된 경우이 코드가 컴파일되는 이유는 무엇입니까? 그러나 구조체가 기존 어셈블리에 정의되어 있으면 컴파일되지 않습니다.
struct Dog{}가 모두 좋습니다.