[英]C# overload resolution and generics
我有以下方法
public static EnumerableAssertions<T> AssertThat<T>(IEnumerable<T> collection)
{
Debug.WriteLine("Enumerable!");
return new EnumerableAssertions<T>(collection);
}
public static ObjectAssertions<T> AssertThat<T>(T value) where T : class
{
Debug.WriteLine("Generic fallback!");
return new ObjectAssertions<T>(value);
}
但是为什么下面的调用解析为通用回退?
List<object> list = null;
AssertThat(list);
根据我的理解, IEnumerable<T>
的重载应该比通用T: class
更具体,但 C# 似乎有不同的看法。 如果我为确切类型List<T>
添加重载,它工作得很好,但当然我不想为每个继承IEnumerable<T>
的类型添加特定重载
操作员:
根据我的理解,IEnumerable 的重载应该比通用 T 更具体:class 但 C# 似乎有不同的看法
苹果和橙子。
这个方法:
public static ObjectAssertions<T> AssertThat<T>(T value) where T : class
...包含显式约束:
where T : class
...同时:
public static EnumerableAssertions<T> AssertThat<T>(IEnumerable<T> collection)
...根本没有明确的限制。
操作员:
但是为什么下面的调用解析为通用回退?
代码:
List<object> list = null;
AssertThat(list);
...最有可能解析为通用类型(带有where T: class
的类型),因为List<>
是一种引用类型,并且比不受限制的IEnumerable<T>.
更符合where T: class
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.