泛型的扩展方法 - 调用者什么时候需要包含类型参数?

Gre*_*reg 0 .net c# generics extension-methods type-parameter

在调用扩展方法时,是否有规则要知道何时必须在客户端代码中传递泛型类型参数?

因此,例如在Program类中,为什么我(a)不能为top.AddNode(节点)传递类型参数,但是后面的(b)top.AddRelationship行我必须传递它们?

class Program
{
    static void Main(string[] args)
    {
        // Create Graph
        var top = new TopologyImp<string>();

        // Add Node
        var node = new StringNode();
        node.Name = "asdf";
        var node2 = new StringNode();
        node2.Name = "test child";
        top.AddNode(node);
        top.AddNode(node2);


        top.AddRelationship<string, RelationshipsImp>(node,node2);  // *** HERE ***

    }
}


public static class TopologyExtns
{

 public static void AddNode<T>(this ITopology<T> topIf, INode<T> node)
    {
        topIf.Nodes.Add(node.Key, node);
    }

    public static INode<T> FindNode<T>(this ITopology<T> topIf, T searchKey)
    {
        return topIf.Nodes[searchKey];
    }

    public static void AddRelationship<T,R>(this ITopology<T> topIf,  INode<T> parentNode,  INode<T> childNode) 
        where R : IRelationship<T>, new()
    {
        var rel = new R();
        rel.Child = childNode;
        rel.Parent = parentNode;
    }
  }


public class TopologyImp<T> : ITopology<T>
{
    public Dictionary<T, INode<T>> Nodes { get; set; }
    public TopologyImp()
    {
        Nodes = new Dictionary<T, INode<T>>();
    }
}
Run Code Online (Sandbox Code Playgroud)

tva*_*son 10

关于第二个例子,编译器不知道你想要什么类型的R; 它只知道它必须实现IRelationship<T>并拥有一个公共默认构造函数.它无法从您传递给方法的任何参数中推断它,因为它们是T类型.在这种情况下,您需要告诉它您要用于哪个类.如果您要传入,请改为创建一个R的实例,作为一个参数,它将能够推断出类型,你不需要提供它们.

在第一种情况下,您不需要提供类型,因为参数属于类型,因此编译器可以推断出您所指的类型.