代码之家  ›  专栏  ›  技术社区  ›  LaserJesus

在C中,是否有可能用以下方式重载泛型强制转换运算符?

  •  15
  • LaserJesus  · 技术社区  · 16 年前

    只是想知道在C 3.5中是否存在以下代码:

    public struct Foo<T> {
    
        public Foo(T item) {
            this.Item = item;
        }
    
        public T Item { get; set; }
    
        public static explicit operator Foo<U> ( Foo<T> a )
            where U : T {
    
            return new Foo<U>((U)a.Item)
        }
    }
    

    谢谢

    3 回复  |  直到 6 年前
        1
  •  20
  •   Jon Skeet    16 年前

    转换运算符不能是泛型。从规范第10.10节,这里是转换运算符声明符的格式:

    conversion-operator-declarator:
        implicit   operator   type   (   type   identifier   )
        explicit   operator   type   (   type   identifier   )

    将其与方法头进行比较:

    方法标题 : 属性 选择 方法修饰符 选择 部分的 选择 返回类型 成员姓名 类型参数列表 选择 ( 形式参数表 选择 ) 类型参数约束子句 选择

    (对于格式设置很抱歉-不确定如何做得更好。)

    请注意,运算符格式不包括类型参数列表或类型参数约束。

        2
  •  2
  •   Gideon    16 年前

    您的代码可以归结为以下几行: return new Foo<U>((U)a.Item)

    尝试将基类分配给继承的类,这是不可能的。

    假设t(基类)是类型 Stream U是类型 MemoryStream (继承的类),不能分配 河流 到类型的变量 内存流 .

        3
  •  0
  •   Arnold Zokas    8 年前

    我认为简短的回答“不可能”。试着用一种方法代替”

    似乎也被这个问题骗了 Solution for overloaded operator constraint in .NET generics