当我在代码审查期间不小心在函数中注释一行时,我注意到我的代码中有一些奇怪的行为。复制非常困难,但在此我将描述一个类似的示例。
我有这个测试课:
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{},一切都很好。