繁体   English   中英

C# 重载解析和 generics

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM