|
|
1
2
只使用一种方法并让它检测
|
|
|
2
8
重命名其中一个方法。你会注意到的
|
|
|
3
5
这是一个很难支持的用例,因为C编译器如何执行重载解析,以及它如何决定要绑定到哪个方法。 第一个问题是 constraints are not part of the signature 不考虑过载分辨率。
您必须克服的第二个问题是,编译器从可用的签名中选择最佳匹配-在处理泛型时,这通常意味着
但从根本上讲,您必须考虑操作单个值与一组值是否确实是 相同操作 . 如果它们在逻辑上是不同的,那么为了清晰起见,您可能需要使用不同的名称。也许有一些用例可以证明单个对象和对象集合之间的语义差异没有意义……但是在这种情况下,为什么要实现两种不同的方法呢?尚不清楚方法重载是表达差异的最佳方法。让我们来看一个导致混淆的例子:
首先,注意在上面的示例中,我们选择忽略返回参数。其次,注意我们调用了一些方法
最后,只有三个选项可以消除示例中的方法的歧义:
选项1是不言而喻的,所以我不再谈论它。 选项2也很容易理解:
方案3更复杂。让我们来看看我们如何实现它。
方法是通过更改
就我个人而言,我觉得这个选项非常难看、不讲理、令人困惑。引入一个未使用的参数是很糟糕的…但遗憾的是,它会奏效的。
更改签名的另一种方法(不那么糟糕)是使返回值
但这真的更好吗?它阻止我们将这些方法用作其他方法调用的参数。这也使得代码不那么清晰和不容易理解。 我将介绍的最后一种替代方法是向标识返回值类型的方法添加另一个通用参数:
所以可以使用提示来帮助编译器为我们选择一个重载…当然。但是,看看作为开发人员,我们要完成的所有额外工作(更不用说引入的丑陋和出错的机会)。 这真的值得付出努力吗?特别是当一个简单可靠的技术(命名方法不同)已经存在帮助我们? |
|
|
4
1
约束不支持排除,这一点一开始可能看起来很令人沮丧,但却是一致的,而且很有意义(例如,考虑到接口并不规定什么实现) 不能 做)。
也就是说,您可以利用IEnumerable重载的约束来进行操作……也许可以将方法更改为具有两个泛型类型
ETA以下代码示例:
|
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |