如何编写单个类以使用不同的数字类型进行多次编译?

dlr*_*as2 5 .net c# conditional-compilation

我正在尝试编写处理不同数字类型的类.我知道C#(和我一般认为.Net)没有INumber接口,所以我不能使用如下内容:

    public class Adder<T> where T:INumber
    {
        public T Add(T a, T b)
        {
            return a + b;
        }
    }
Run Code Online (Sandbox Code Playgroud)

不过没关系,因为我想避免我的每个号码的装箱/拆箱.但是,我可以为我想支持的每种类型使用条件编译:

#if FLOAT 
    public class AdderF
    {
        public float Add(float a, float b)
#else
    public class Adder
    {
        public int Add(int a, int b)
#endif
        {
            return a + b;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这意味着我需要编写不同的Library.dllLibraryF.dll,但是.有没有更优雅的解决方案呢?

显然,在我的例子中,我可以简单地编写代码两次.但是,我想使用此过程来创建具有整数版本和浮点版本的大型复杂数据结构,因此在更新结构时不希望出现复制粘贴错误的可能性.我也不希望速度损失将浮点结构包装在一个整体包装器中,并且不必要地将所有输入转换为更宽松的数据类型.

Roy*_*tus 3

我想这取决于你想要的严格程度。您是否想要一个Add只接受两个完全相同类型的参数(int 和 int、float 和 float)的方法...?如果没有,并且性能也不是非常重要,那么您只需实施您的解决方案即可decimal,一切都会起作用。

如果它确实必须严格,并且您想要每种类型的特定版本,您可能需要研究 T4 代码生成。它类似于 C++ 的模板(有些人认为 C++ 模板和 C# 泛型是相同的,但事实并非如此)。

斯科特·汉塞尔曼(Scott Hanselman)就此写了一篇有趣的文章。