【问题标题】:Generic types not equal泛型类型不相等
【发布时间】:2009-02-05 11:05:19
【问题描述】:

下面的代码段打印出“类型不一样。”。为什么?我知道使用interfaceOnMyType.GetGenericTypeDefinition() 可以解决问题,但我为什么要这样做?

class Program
{
    static void Main(string[] args)
    {
        var myType = typeof(Baz<>);
        var interfaceOnMyType = myType.GetInterfaces().SingleOrDefault();
        var exactType = typeof(IBar<>);
        if (exactType == interfaceOnMyType)
        {
            Console.WriteLine("The types ARE the same.");
        }
        else
        {
            Console.WriteLine("The types ARE NOT the same.");
        }
        Console.ReadLine();
    }
}

interface IBar<T>
{
}

class Baz<T> : IBar<T>
{
}

【问题讨论】:

    标签: c# .net generics


    【解决方案1】:
    interfaceOnMyType.GetGenericTypeDefinition()
    

    返回接口的封闭构造类型,与返回的类型不同

    typeof(IBar<>)
    

    Here is the MSDN article on GetGenericTypeDefinition,这里有一段很好的引述来解释它是如何工作的:

    给定一个表示此构造类型的Type 对象,GetGenericTypeDefinition 方法返回泛型类型定义。


    编辑(上面的答案在某些情况下是正确的,但在这个情况下是错误的):

    我想我现在可能已经找到了。类型比较失败的原因是因为myType.GetInterfaces()返回的Type与接口本身的类型接近但不相同。

    根据MSDN

    如果您使用BaseType 属性获取Derived 的基本类型,则生成的Type 对象的FullName 属性将返回null(在Visual Basic 中为Nothing)。要获取非空的FullName,可以使用GetGenericTypeDefinition 方法获取泛型类型定义。

    所以我认为这是您看到的问题。由于基本接口是通过GetInterfaces 检索的,因此该调用检索到的任何类型都不会有FullName (source)。由于它没有FullName,因此类型将在比较中失败。

    如果你比较的是你不是的构造类型,我最初写的内容将是正确的。所以不幸的是,我的第一个答案是完全错误的 - 我已经留下了它,以便留下的 cmets 有意义。

    【讨论】:

    • 不,它们是一样的 - 试试看。
    【解决方案2】:

    原因是 interfaceOnMyType.IsGenericTypeDefinition 返回 false,而 myType.IsGenericTypeDefinitionexactType.IsGenericTypeDefinition 都返回 true。也就是说,仅仅因为您从泛型类型定义中检索非构造泛型类型并不意味着您检索的类型本身就是泛型类型定义。

    【讨论】:

      【解决方案3】:

      试试下面的

                  Console.WriteLine("{0}", (null != exactType.FullName) ? exactType.FullName : "null");
                  Console.WriteLine("{0}", (null != interfaceOnMyType.FullName) ? interfaceOnMyType.FullName : "null");
      

      输出是:

      test.Program+IBar`1
      null

      这支持了 Andrew Hare 在此处发布的发现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多