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

如何传递转换器(约束不适用于泛型参数)

  •  1
  • codymanix  · 技术社区  · 15 年前

    我想把一个转换器传递给一个方法,约束必须是转换器总是得到一个字符串作为参数。我尝试了以下操作,但无法编译:

    class Test
    {
       public void Foo(string val, Converter<Tin,Tout> conv)
            where Tin:string
       {
          myObj = conv(val);
       }
    }
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   djdd87    15 年前

    每当函数签名应携带泛型参数或带有泛型类型参数的参数时,该类型参数必须是方法声明的一部分,并且该方法将成为泛型本身。

    尤其是,要约束的泛型类型参数必须是foo的方法签名的一部分。

    试试这个方法:

    class Test 
    { 
       public void Foo<Tout>(string val, Converter<string, Tout> conv) 
       { 
          myObj = conv(val); 
       } 
    } 
    
        2
  •  2
  •   djdd87    15 年前

    如果锡总是一个字符串,那么约束它有什么意义呢?

    class Test 
    { 
       public void Foo<Tout>(string val, Converter<string,Tout> conv) 
       { 
          myObj = conv(val); 
       } 
    } 
    

    把它扔掉 Tin 类型与用途 string 在你 Converter . 我觉得你把事情搞得太复杂了。

    不能将字符串用作 generic constraint 因为它是一个 sealed class . 这是完全有道理的,因为没有什么可以继承。 一串 所以为什么要为 一串 ?

    也就是说,如果你 可以 从字符串继承:

    public SuperString : string
    

    然后你可以用 一串 作为约束并通过 SuperString 作为 . 不管你 不能 这样做 一串 是一个 密封类 . 因此,你能传递给的唯一对象 String 不管怎样。

    因此,你也可以摆脱 使用我上面写的代码。

        3
  •  1
  •   leppie    15 年前

    你的代码毫无意义。

    where Tin:string 无效。修复这个问题,并将泛型参数添加到方法中。