这些通用参数约束意味着什么?

时间:2015-08-05 03:19:44

标签: c# generics constraints

我使用的方法是第一个参数:

Action<IFieldsetter<Contact>>

我该怎么读?是否意味着这必须是一个Action对象,其中Action构造函数被约束为只接受实现IFieldsetter的东西?看起来IFieldsetter本身受到限制,但我根本不理解这一部分。

4 个答案:

答案 0 :(得分:4)

它不是一个真正的约束,而只是它需要的类型。因此,该方法的第一个参数是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);
}

对类型参数的约束是另一回事。您可以详细了解here

答案 1 :(得分:1)

C#System.Action(MSDN)是一个委托对象,其中Action<T>相当于与void FunctionName(T)匹配的委托函数。所以你可以将它设置为一个函数,然后再调用该函数。

部分通用程序块<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)
{
}

答案 2 :(得分:1)

这是嵌套的泛型类型参数。从最外层,您可以看到这是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类型的字段。现在你明白了吗?

答案 3 :(得分:0)

Action<IFieldsetter<Contact>>表示Action委托接受实现通用接口IFieldsetter的类型参数。假设一个类是用IFieldsetter插入实现的,其中Contact作为通用参数,如下所示。

public class Test: IFieldsetter<Conatct>
{

}

现在,此测试类的实例可以作为参数传递给Action deletegate。