我正在尝试编写处理不同数字类型的类。我知道C#(我相信通常是.Net)没有INumber接口(interface),因此我不能使用以下内容:

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

没关系,因为我想避免对每个数字进行装箱/拆箱。但是,我可以对要支持的每种类型使用条件编译:
#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;
        }
    }

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

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

最佳答案

我想这取决于您想要的严格程度。您是否需要只接受两个完全相同类型的参数(int和int,float和float)的Add方法...?如果不是这样,并且性能不是很重要,那么您可以使用decimal实现您的解决方案,所有解决方案都可以。

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

斯科特·汉塞尔曼(Scott Hanselman)为此写了an interesting article

关于c# - 如何编写单个类以使用不同的数字类型多次编译?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6550164/

10-17 02:49