【发布时间】:2020-12-12 23:49:12
【问题描述】:
上下文:
我正在用 C# 实现一个 BigRational 结构,它需要各种算术和比较重载。由于使用了var,许多重载中的代码看起来完全相同。最重要的是,我收到了 CA2225 的警告,其中指出各种运营商需要一种“友好的替代命名”方法。见https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca2225
由于许多算术运算符都被重载了
- (BigRational, BigRational) -> BigRational
- (BigRational, BigInteger) -> BigRational
- (BigInteger, BigRational) -> BigRational
- (BigRational,长)-> BigRational
- (long, BigRational) -> BigRational
- (BigRational, ulong) -> BigRational
- (ulong, BigRational) -> BigRational
和比较运算符
- (BigRational, BigRational) -> bool
- (BigRational, BigInteger) -> bool
- (BigInteger, BigRational) -> bool
- (BigRational,长)-> bool
- (long, BigRational) -> bool
- (BigRational, ulong) -> bool
- (ulong, BigRational) -> bool
这会导致大量重复代码和样板。
问题:
有没有简单的方法来使用 C# 9 样式生成器来实现这个?
侧面思考:
如果 C# 能够在语言中内置重载生成功能,那就太好了
public static BigRational Add<T>(BigRational augend, T addend)
where T overloads: BigInteger, long, ulong
{
// use var in code...
}
等价于
public static BigRational Add(BigRational augend, BigInteger addend)
{
}
public static BigRational Add(BigRational augend, long addend)
{
}
public static BigRational Add(BigRational augend, ulong addend)
{
}
这也允许人们为不共享基类或接口但具有非常相似的 API 的类型编写单个函数。
【问题讨论】:
-
为什么更简单的隐式转换方法不起作用?
-
这种重构工具在 Visual Studio 中不可用,但也许像 ReSharper 这样的插件可以做到这一点,否则您可以创建自己的。
标签: c# code-generation c#-9.0