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

时间:2010-06-21 11:04:50

标签: c# .net generics

我想将转换器传递给方法,约束必须是转换器总是将字符串作为参数。我尝试了以下内容,但不会编译:

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

3 个答案:

答案 0 :(得分:2)

如果Tin总是成为一个字符串,那么限制Tin会有什么意义呢?

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

只需删除Tin类型,然后在string中使用Converter即可。我认为你过于复杂了。

您不能将字符串用作generic constraint,因为它是sealed class。这是完全合理的,因为没有任何东西可以从string继承,那么为什么要为string添加约束?

即。如果 COULD 继承自字符串:

public SuperString : string

然后,您可以使用string作为约束,并将SuperString作为Tin传递。但是,不能执行此操作,因为stringsealed class。因此,您可以传递给Tin的唯一对象是String

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

答案 1 :(得分:1)

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

特别是,要约束的泛型类型参数必须是Foo方法签名的一部分。

以这种方式尝试:

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

答案 2 :(得分:1)

你的代码荒谬。

where Tin:string无效。修复此问题,并将通用参数添加到您的方法中。