来自通用接口<object>的type.IsAssignableFrom返回false

时间:2018-12-20 17:27:42

标签: c#

为什么此示例打印为假?

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            bool assignable = typeof(Results<Foo>).IsAssignableFrom(typeof(IResults<object>));            
            Console.WriteLine(assignable);
        }
    }

    public interface IResults<T>
    {
        IEnumerable<T> Items { get; }
    }

    public class Results<T> : IResults<T>
    {
        public IEnumerable<T> Items { get; set; }
    }

    public class Foo
    {
        public string Name { get; }
    }
}

1 个答案:

答案 0 :(得分:0)

false是正确的结果。检查typeof(Results<Foo>).IsAssignableFrom(typeof(IResults<object>))是否就像询问以下代码段是否可以编译:

Results<Foo> a = ...;
IResults<ojbect> b = ...;
a = b; // Will this compile?

假设IResultsResults实现的接口,则不能将IResults对象分配给Results引用,因为编译器无法知道运行时是否是否为Results对象的类型。因此,在这里返回false是有道理的。