【发布时间】:2014-09-24 14:37:36
【问题描述】:
我有这个代码
public enum MyEnumOne : byte { ... }
public enum MyEnumTwo : byte { ... }
public class MyClass
{
public readonly MyEnumOne E1;
public readonly MyEnumTwo E2;
private MyClass(MyEnumOne e1)
{
E1 = e1;
}
private MyClass(MyEnumTwo e2)
{
E2 = e2;
}
public static MyClass CreateWithE1(MyEnumOne e1)
{
return new MyClass(e1);
}
public static MyClass CreateWithE2(MyEnumTwo e2)
{
return new MyClass(e2);
}
}
我如何确定这段代码总是会强制转换正确的构造函数重载?
var A = MyClass.CreateWithE1(0);
var B = MyClass.CreateWithE2(0);
我可以通过使类可变来确保这一点,但我不需要类是可变的。
注意:如果我在使类不可变时犯了任何错误,请告诉我:)
编辑:两个枚举的第一个元素都是None = 0,并且在某些合法情况下,可以创建一个枚举为None 的实例。
【问题讨论】:
-
我认为它足够安全。由于您使用
MyEnumOne和MyEnumTwo作为参数类型。您是否收到任何关于模糊呼叫的警告? -
或者您是否担心使用仅存在于
E2中的值 调用CreateWithE1? -
怎么可能不使用正确的构造函数重载?如果你传入一个类型为
MyEnumOne的对象,它怎么可能调用MyEnumTwo重载?如果您尝试显式调用该重载(通过删除另一个),它甚至不会编译。 -
@TimSchmelter 这些方法有不同的名称,所以一开始就没有删除的风险。如果他试图重载一个方法/构造函数,他会得到一个编译时歧义错误,你只是用运行时错误来掩盖它。
-
爱失败的工厂 - 还要添加一个
[Obsolete("Don't call with an int", true)]以导致编译器失败。
标签: c# constructor enums overloading