我的类目前有两个构造函数,它们是重载:
public CustomRangeValidationAttribute(string value) {}
和
public CustomRangeValidationAttribute(object value) {}
这似乎工作正常:当我使用 string
调用方法时,当我使用不同的值(例如 integer
或 boolean
,调用第二个构造函数。
我假设有一个规则强制特定类型匹配到更具体的重载中,防止
var c = new CustomRangeValidationAttrubute("test");
从调用对象重载。
这是“安全代码”,还是应该(或可以)改进代码?我有一种挥之不去的感觉,这不是最佳做法。
最佳答案
您有两个重载,它们仅在引用类型上有所不同,并且引用类型之间存在层次关系,因此一个可以强制转换为另一个。
在这种情况下,您确实应该确保选择更宽的过载时,代码在逻辑上相同,但引用结果证明是更派生的类型 1 ,2。 那是您集中注意力的地方。当然,如果您能坚持这条规则,通常会发现派生程度更高的重载并不是必需的,而可以只是在更广泛的方法中的特殊情况。
1特别是因为,正如 vc74 在评论中指出的那样,重载解析(通常忽略 dynamic
)是在编译时根据编译时类型完成的3.
2这符合重载的相同广泛原则。不要让选择哪个导致逻辑上不同的结果的重载。如果您表现出不同的行为,请不要给它们相同的名称(对于构造函数,这可能意味着拆分为两个单独的类,如果您打算这样做的话,可能具有共享的基类)
3我很欣赏这是针对属性的,因此您希望只有编译时相关,但我仍然会尽可能遵循一般原则。
关于c# - 具有字符串参数的构造函数和具有对象参数的相同重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51495319/