c# - 具有字符串参数的构造函数和具有对象参数的相同重载

标签 c# overloading constructor-overloading

我的类目前有两个构造函数,它们是重载:

public CustomRangeValidationAttribute(string value) {}

public CustomRangeValidationAttribute(object value) {}

这似乎工作正常:当我使用 string 调用方法时,当我使用不同的值(例如 integerboolean,调用第二个构造函数。

我假设有一个规则强制特定类型匹配到更具体的重载中,防止

var c = new CustomRangeValidationAttrubute("test");

从调用对象重载。

这是“安全代码”,还是应该(或可以)改进代码?我有一种挥之不去的感觉,这不是最佳做法。

最佳答案

您有两个重载,它们仅在引用类型上有所不同,并且引用类型之间存在层次关系,因此一个可以强制转换为另一个。

在这种情况下,您确实应该确保选择更宽的过载时,代码在逻辑上相同,但引用结果证明是更派生的类型 1 ,2是您集中注意力的地方。当然,如果您能坚持这条规则,通常会发现派生程度更高的重载并不是必需的,而可以只是更广泛的方法中的特殊情况。


1特别是因为,正如 vc74 在评论中指出的那样,重载解析(通常忽略 dynamic)是在编译时根据编译时类型完成的3.

2这符合重载的相同广泛原则。不要让选择哪个导致逻辑上不同的结果的重载。如果您表现出不同的行为,请不要给它们相同的名称(对于构造函数,这可能意味着拆分为两个单独的类,如果您打算这样做的话,可能具有共享的基类)

3我很欣赏这是针对属性的,因此您希望只有编译时相关,但我仍然会尽可能遵循一般原则。

关于c# - 具有字符串参数的构造函数和具有对象参数的相同重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51495319/

相关文章:

c# - 如何仅从列表中选择某些属性设置为 true 的项目

c# - 从 EPiServer 的 PageFiles 文件夹中获取目录

c++ - 功能覆盖在哪里完成?

C++运算符>>重载问题: change object only once

c# - UWP 可以在 .NET 中运行吗?

c# - 如何使用 EF Core Oracle 生成和自动递增 Id

scala - 为什么 Scala 编译器不允许使用默认参数的重载方法?

c++ - 删除的函数和 ADL

python - 如何在python中实现多个构造函数?

c# - 将 NULL 传递给构造函数