这些泛型参数约束是什么意思

本文关键字:是什么 意思 参数约束 泛型 | 更新日期: 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。