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()
得到运行时关于装箱的特殊处理ANullable
本身从不装箱,而是:Nullable
- 如果
包含一个值,则该值将被装箱(在本例中为Nullable
值123)int
- 如果
不包含值,则装箱操作的计算结果为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
得到运行时关于装箱的特殊处理ANullable
本身从不装箱,而是:
- 如果
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的评论的组合。我将起草一份答复。