代码之家  ›  专栏  ›  技术社区  ›  Tomas Kubes

type.IsAssignableFrom from泛型接口<object>返回false

c#
  •  1
  • Tomas Kubes  · 技术社区  · 6 年前

    为什么这个例子打印错误?

    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 回复  |  直到 6 年前
        1
  •  0
  •   Mureinik    6 年前

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

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

    IResults 是一个 Results I结果 反对 后果 引用,因为编译器无法知道 后果 反对与否。因此,返回 错误的 这是有道理的。