【问题标题】:What's the "`1" for in class names sent from Reflection/CodeDom/CLR?从 Reflection/CodeDom/CLR 发送的类名中的“`1”是什么?
【发布时间】:2023-03-27 16:55:01
【问题描述】:

我不记得我在哪里看到这个奇怪的`1(单勾号和数字 1)出现在类名旁边,但它在调试时检查变量值时出现,最近出现在答案中this question.

targetClass.BaseTypes.Add(new CodeTypeReference { BaseType = "DataObjectBase`1[Refund]", Options = CodeTypeReferenceOptions.GenericTypeParameter })

我很好奇:这是从哪里来的,为什么会在那里?

【问题讨论】:

    标签: c# .net generics clr types


    【解决方案1】:

    它是具有 1 个类型参数的泛型类型。

    例如,List<T>

    System.Collections.Generic.List`1
    

    Dictionary<TKey, TValue>

    System.Collections.Generic.Dictionary`2
    

    这允许泛型类型被类型参数的数量重载。

    【讨论】:

    • +1 哎呀!快了 6 秒——这是我见过的最接近的两个答案!打得好……
    • @Andrew:我想我被 Jon 打败了 3 秒。
    • 让 Jon 来保持记录 :)
    • 所以只是约定俗成?奇怪的是你可以在类名中使用 ♠ 字符,但不能使用低级、普通、单勾
    • 哦,我想你欠安德鲁一杯可乐;)
    【解决方案2】:

    它是符合 CLS 的类名中泛型类型参数的数量。它是必需的,因为类型可以在参数数量上重载;例如:

    class Foo { }
    class Foo<T1> { }
    class Foo<T1, T2> { }
    

    为了区分这些情况,编译器生成以下不同的名称:

    Foo
    Foo`1
    Foo`2  
    

    请注意,虽然这是 CLS 提供程序要求,但它不是 CLR 要求或限制。就 CLR 本身而言,泛型类型可以具有任何名称,但没有两个类型可以具有相同的完全限定名称。因此需要反引号修饰方案。

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2010-11-07
      • 2012-08-14
      • 2017-09-23
      • 1970-01-01
      • 2015-11-20
      • 2016-01-16
      • 2011-01-21
      • 2014-05-31
      相关资源
      最近更新 更多