C# 如何";定制";类型的名称,如Nullable?

C# 如何";定制";类型的名称,如Nullable?,c#,C#,Nullable类是如何实现的 public class Foo<T> { public T Bar { get; set; } } var n1 = new Nullable<int>(123).GetType().Name; // "Int32" var n2 = new Foo<int>().GetType().Name; // "Foo`1" 公共类Foo { 公共T条{get;set;} } var n1=new Nullable(123

Nullable
类是如何实现的

public class Foo<T>
{
    public T Bar { get; set; }
}

var n1 = new Nullable<int>(123).GetType().Name; // "Int32"
var n2 = new Foo<int>().GetType().Name; // "Foo`1"
公共类Foo
{
公共T条{get;set;}
}
var n1=new Nullable(123).GetType().Name;//“Int32”
var n2=new Foo().GetType().Name;//“Foo`1”

是否可以使
Foo
具有相同的类型名称,即“Int32”

tl;dr:不,您不能更改
Foo
的名称。您看到的
Nullable
是可空值装箱方式的副作用


关于
Nullable
类型,有一些因素会导致您看到的行为:

  • 对值类型调用
    .GetType()
    ,会导致该值无效
  • Nullable
    得到运行时关于装箱的特殊处理A
    Nullable
    本身从不装箱,而是:
    • 如果
      Nullable
      包含一个值,则该值将被装箱(在本例中为
      int
      值123)
    • 如果
      Nullable
      不包含值,则装箱操作的计算结果为
      null
结果是,在代码中,
Object.GetType()
在执行时看到的是一个装箱的
int
值,而不是一个装箱的
null
对象(因为这也是不可能的)。这就是为什么可为null的名称与其内容的名称相同。这是演示正在发生的事情的最简单方法:

new Nullable<int>(123).GetType() == typeof(int)
new Nullable<int>(123).GetType() != typeof(Nullable<int>)
new Nullable(123).GetType()==typeof(int)
新的Nullable(123).GetType()!=typeof(可为空)
作为旁注,因为不带值的nullable框为null,所以要在nullable上调用
.GetType()
!这同时是有意义的(它是null,对吗?)和没有意义的(它是一种值类型…它不可能真的是null!)。当一个nullable没有值时,可以调用在
nullable
本身上实现或重写的方法(因为这些调用不需要装箱),但是不能调用从
对象继承而未重写的方法

Nullable
有一种奇怪的双重性格,有时会导致类似这样的惊喜


现在我们知道了
Nullable
的情况,我们可以看到
Nullable
实际上并没有重命名自己——您看到的类型名称是Nullable装箱行为的结果;dr:不,您不能更改
Foo
的名称。您看到的
Nullable
是可空值装箱方式的副作用


关于
Nullable
类型,有一些因素会导致您看到的行为:

  • 对值类型调用
    .GetType()
    ,会导致该值无效
  • Nullable
    得到运行时关于装箱的特殊处理A
    Nullable
    本身从不装箱,而是:
    • 如果
      Nullable
      包含一个值,则该值将被装箱(在本例中为
      int
      值123)
    • 如果
      Nullable
      不包含值,则装箱操作的计算结果为
      null
结果是,在代码中,
Object.GetType()
在执行时看到的是一个装箱的
int
值,而不是一个装箱的
null
对象(因为这也是不可能的)。这就是为什么可为null的名称与其内容的名称相同。这是演示正在发生的事情的最简单方法:

new Nullable<int>(123).GetType() == typeof(int)
new Nullable<int>(123).GetType() != typeof(Nullable<int>)
new Nullable(123).GetType()==typeof(int)
新的Nullable(123).GetType()!=typeof(可为空)
作为旁注,因为不带值的nullable框为null,所以要在nullable上调用
.GetType()
!这同时是有意义的(它是null,对吗?)和没有意义的(它是一种值类型…它不可能真的是null!)。当一个nullable没有值时,可以调用在
nullable
本身上实现或重写的方法(因为这些调用不需要装箱),但是不能调用从
对象继承而未重写的方法

Nullable
有一种奇怪的双重性格,有时会导致类似这样的惊喜


现在我们知道了
Nullable
的情况,我们可以看到
Nullable
实际上并没有重命名自己——您看到的类型名称是Nullable装箱行为的结果。

注意
Nullable
在运行时得到了一些非常特殊的处理。特别是,如果不带值的
null
被装箱,则装箱的对象是
null
——与其他所有值类型不同。我怀疑这是类似的特殊待遇。因为
Nullable
是一个
ValueType
并且值类型被装箱了,所以这就是你得到的(另请参见源代码),答案是我的评论和@AdrianoRepetti的评论的组合。我将起草一个答案。请注意,
Nullable
在运行时得到了一些非常特殊的处理。特别是,如果不带值的
null
被装箱,则装箱的对象是
null
——与其他所有值类型不同。我怀疑这是类似的特殊待遇。因为
Nullable
是一个
ValueType
并且值类型被装箱了,所以这就是你得到的(另请参见源代码),答案是我的评论和@AdrianoRepetti的评论的组合。我将起草一份答复。