这些泛型参数约束是什么意思
本文关键字:是什么 意思 参数约束 泛型 | 更新日期: 2023-09-27 18:06:35
我使用的方法与此作为第一个参数:
Action<IFieldsetter<Contact>>
我怎么读这个?这是否意味着这必须是一个Action对象,其中Action构造函数被约束为只接受实现IFieldsetter的东西?它看起来像IFieldsetter本身被约束,但我不理解这部分。
这不是一个实际的约束,而只是它需要的类型。因此,该方法的第一个参数是Action
(即delegate
),它只有一个参数,而该参数是IFieldsetter<Contact>
,不管这意味着什么。我的猜测是IFieldsetter
公开了一个setter,在这种情况下,它必须处理Contact
类型,但是您应该是真正知道它们是什么和做什么的人!如果你需要进一步的帮助,把这个接口和这个类的代码贴出来。
例如,如果它是Action<IEnumerable<String>>
,这意味着委托接收一个字符串列表作为参数。下面是一些代码:
// Your method with the *special* parameter.
private void ChrisMethod(Action<IEnumerable<String>> method)
{
string[] exampleList = { "First", "Second", "Third" };
method(exampleList);
}
// The method that can be used as parameter.
private void ParameterMethod(IEnumerable<String> list)
{
foreach(string str in list)
Console.WriteLine(str);
}
public void Main()
{
ChrisMethod(ParameterMethod);
}
对类型参数的约束是另一回事。
c#系统。Action (MSDN)是一个委托对象,其中Action<T>
相当于匹配void FunctionName(T)
的委托函数。因此,您可以将其设置为一个函数,并在稍后调用该函数。
section泛型块<Contact>
应用于IFieldsetter
,因此您有一个接受IFieldsetter<Contact>
参数的Action。在不了解IFieldsetter的情况下,我无法告诉你它会用Contact泛型参数做什么。
为了使用这个,你可以像下面这样:
void Main()
{
FunctionThatDoesStuff(SetField);
}
void FunctionThatDoesStuff(Action<IFieldsetter<Contact>> action)
{
var setter = new IFieldsetter<Contact>();
action(setter);
}
void SetField(IFieldsetter<Contact> setter)
{
}
这是嵌套的泛型类型参数。从最外层,您可以看到这是一个Action<T>
委托。委托需要一个类型为T的参数。在本例中,T被IFieldsetter<Contact>
代替。即Action<IFieldSetter<Contact>>
需要一个IFieldSetter<Contact>
类型的参数。现在IFieldSetter<T>
接口设置了一个类型为T的字段,在本例中,T被Contact
取代,因此IFieldSetter<Contact>
设置了一个类型为Contact
的字段。
让我们总结一下: Action<IFieldsetter<Contact>>
代表一个Action
委托,它需要一个IFieldSetter
类型的参数,这个参数可以设置一个Contact
类型的字段。
Action<IFieldsetter<Contact>>
表示动作委托接受实现泛型接口IFieldsetter类型的参数。假设一个类是用IFieldsetter接口实现的,Contact作为泛型参数,如下所示。
public class Test: IFieldsetter<Conatct>
{
}
现在这个测试类的实例可以作为参数传递给Action delegate。