我想将转换器传递给方法,约束必须是转换器总是将字符串作为参数。我尝试了以下内容,但不会编译:
class Test
{
public void Foo(string val, Converter<Tin,Tout> conv)
where Tin:string
{
myObj = conv(val);
}
}
答案 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
传递。但是,不能执行此操作,因为string
是sealed 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
无效。修复此问题,并将通用参数添加到您的方法中。