C#中的幻像泛型约束

宾坎薪水人

我经常遇到这个问题:我喜欢为不同的返回类型重载具有相同参数的某些方法,但.NET拒绝对密封的类/基元进行泛型约束。我将这种模式称为phantom generics

  • 我知道一个丑陋的解决方法:将类型实现的每个接口放在where语句后面

  • 我的问题:有没有办法在泛型中使用显式类型来说明返回类型并保持方法的区别?

    这是我的代码:

    public static class Reinterpret {
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static unsafe float Cast<T>(int value) where T : float { //'float' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.
            return *((float*)&value); //reinterpret the bytes of 'value' to a float
        }
    
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static unsafe float Cast<T>(uint value) where T : float { //'float' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.
            return *((float*)&value);
        }
    
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static unsafe double Cast<T>(long value) where T : double { //'double' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.
            return *((double*)&value);
        }
    
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static unsafe double Cast<T>(ulong value) where T : double { //'double' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.
            return *((double*)&value);
        }
    }
    
  • 本·沃格特

    泛型不是模板。它们的行为不像模板。它们不能像模板一样工作。

    “ phantom”泛型参数不会帮助您模拟模板(reinterpret_cast无论如何它也不是实际的模板),因为您很快就会遇到泛型不支持专业化的事实

    特别是,您问“有没有办法在泛型中使用显式类型来...使方法保持不同?” 并评论说“通用约束……使方法截然不同”。但是他们实际上没有。这些方法的区别仅在于参数类型不同。泛型是根据重载计算的,它们不会影响重载。

    本文收集自互联网,转载请注明来源。

    如有侵权,请联系[email protected] 删除。

    编辑于
    0

    我来说两句

    0条评论
    登录后参与评论

    相关文章

    来自分类Dev

    泛型约束在C#中似乎不起作用

    来自分类Dev

    C#集合类型约束泛型

    来自分类Dev

    泛型类的字段约束 - C#

    来自分类Dev

    是否可以在C#泛型方法中定义“ not Nullable <T>”约束?

    来自分类Dev

    如何在具有多个约束的C#中实现泛型方法

    来自分类Dev

    泛型类型中的确切类型约束-C#

    来自分类Dev

    泛型类型中的确切类型约束-C#

    来自分类Dev

    C#从具有约束的泛型推断类型

    来自分类Dev

    如何克服C#对泛型约束进行重载的限制?

    来自分类Dev

    带有约束的 C# 继承泛型类

    来自分类Dev

    如果泛型类型约束还必须在c#中实现接口,则类类型约束将实现什么?

    来自分类Dev

    C#中的嵌套泛型问题

    来自分类Dev

    C#中泛型类型的缺点

    来自分类Dev

    C#中的泛型类型

    来自分类Dev

    C#中的静态泛型方法

    来自分类Dev

    在C#中循环泛型类型

    来自分类Dev

    C#中的数组与泛型

    来自分类Dev

    C#中的泛型类型转换

    来自分类Dev

    C#中的双重泛型类型

    来自分类Dev

    在C#中调用泛型方法

    来自分类Dev

    Unity C#中的泛型

    来自分类Dev

    继承中的C#多个泛型

    来自分类Dev

    如何在C#中将受约束的泛型类型的Action委托存储在类型安全的集合中?

    来自分类Dev

    如何在C#中将受约束的泛型类型的Action委托存储在类型安全的集合中?

    来自分类Dev

    在其成员函数之一中进一步约束泛型类c#

    来自分类Dev

    在C#中,对于同一个泛型,有什么替代更多类约束的方法?

    来自分类Dev

    强制泛型在TypeScript中实现属性(约束泛型)

    来自分类Dev

    使用幻像类型解码泛型

    来自分类Dev

    C#泛型:“ X <T>其中T:X <T>”泛型类型约束的意义是什么?

    Related 相关文章

    热门标签

    归档