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的实例,作为一个参数,它将能够推断出类型,你不需要提供它们.
在第一种情况下,您不需要提供类型,因为参数属于类型,因此编译器可以推断出您所指的类型.
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |