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

C# 如何传递转换器(约束不适用于泛型参数),c#,.net,generics,C#,.net,Generics,我想将一个转换器传递给一个方法,而约束条件必须是转换器总是获取一个字符串作为参数。我尝试了以下操作,但无法编译: class Test { public void Foo(string val, Converter<Tin,Tout> conv) where Tin:string { myObj = conv(val); } } 类测试 { 公共void Foo(字符串val,转换器conv) 哪里有锡:线 { myObj=conv(v

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

class Test
{
   public void Foo(string val, Converter<Tin,Tout> conv)
        where Tin:string
   {
      myObj = conv(val);
   }
}
类测试
{
公共void Foo(字符串val,转换器conv)
哪里有锡:线
{
myObj=conv(val);
}
}

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

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

试着这样做:

class Test 
{ 
   public void Foo<Tout>(string val, Converter<string, Tout> conv) 
   { 
      myObj = conv(val); 
   } 
} 
类测试
{ 
公共void Foo(字符串val,转换器conv)
{ 
myObj=conv(val);
} 
} 

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

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

试着这样做:

class Test 
{ 
   public void Foo<Tout>(string val, Converter<string, Tout> conv) 
   { 
      myObj = conv(val); 
   } 
} 
类测试
{ 
公共void Foo(字符串val,转换器conv)
{ 
myObj=conv(val);
} 
} 
你的代码毫无意义

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

您的代码毫无意义


其中Tin:string
无效。修复该问题,并将通用参数添加到方法中。

如果Tin始终是字符串,那么约束Tin有什么意义

class Test 
{ 
   public void Foo<Tout>(string val, Converter<string,Tout> conv) 
   { 
      myObj = conv(val); 
   } 
} 
然后,您可以使用
string
作为约束,并以
Tin
的形式通过
SuperString
。但是,由于
string
是一个
密封类,因此无法执行此操作。因此,您可以传递到
Tin
的唯一对象是
String


正因为如此,您最好去掉
Tin
,使用我上面写的代码。

如果Tin总是一个字符串,那么约束Tin有什么意义

class Test 
{ 
   public void Foo<Tout>(string val, Converter<string,Tout> conv) 
   { 
      myObj = conv(val); 
   } 
} 
然后,您可以使用
string
作为约束,并以
Tin
的形式通过
SuperString
。但是,由于
string
是一个
密封类,因此无法执行此操作。因此,您可以传递到
Tin
的唯一对象是
String


因此,您最好去掉
Tin
,使用我上面编写的代码。

这不会编译。字符串不能用作约束。它现在告诉我字符串将不是有效约束,并且只有接口或非密封类才适用。好的,我忘记了非密封约束。相应地编辑。这不会编译。字符串不能用作约束。它现在告诉我字符串将不是有效约束,并且只有接口或非密封类才适用。好的,我忘记了非密封约束。相应地进行了编辑。@codemanix-我认为在Tin始终是字符串的情况下为其添加泛型类型约束过于复杂了。看到我的答案,它将完全满足您的要求。@codemanix-我认为您在Tin总是字符串的情况下,为其添加了泛型类型约束,这太复杂了。看看我的答案,它会完全符合你的要求。这有什么荒谬之处?除了它没有编译之外,这也是问题的一部分。我希望以某种方式约束转换器,使其始终接受字符串,但可能返回任何内容。@codemanix-当转换器可以将字符串作为第一个参数时,为什么需要将其约束为字符串?@codemanix:如果只能是
string
,为什么不直接使用
string
。不可能是别的了。。。。首先,
Tin
不需要通用参数。请看上面@GenericTypeTea的答案。这有什么荒谬之处?除了它没有编译之外,这也是问题的一部分。我希望以某种方式约束转换器,使其始终接受字符串,但可能返回任何内容。@codemanix-当转换器可以将字符串作为第一个参数时,为什么需要将其约束为字符串?@codemanix:如果只能是
string
,为什么不直接使用
string
。不可能是别的了。。。。首先,
Tin
不需要通用参数。请参见上文@GenericTypeTea的答案。