我已经阅读了“ UnderlyingSystemType”的定义,即它“指示了由表示该类型的公共语言运行库提供的类型”。
在When does the UnderlyingSystemType differ from the current Type instance的SO上有一个相关的链接,但是我不能从答案中得知实际上是否有可能有一个对象的类型与UnderlyingSytemType不同。
我最近了解了CLS合规性,并且未签名的整数不符合CLS。我真的希望也许能够做到,不符合CLS的类型可能具有不同的基础类型,但事实并非如此。
对于它的价值,我用来测试的代码是:
Byte t01 = 1;
SByte t02 = 1;
Int16 t03 = 1;
UInt16 t04 = 1;
Int32 t05 = 1;
UInt32 t06 = 1;
Int64 t07 = 1;
UInt64 t08 = 1;
Single t09 = 1;
Double t10 = 1;
Decimal t11 = 1;
Console.WriteLine(t01.GetType().Equals(t01.GetType().UnderlyingSystemType));
Console.WriteLine(t02.GetType().Equals(t02.GetType().UnderlyingSystemType));
Console.WriteLine(t03.GetType().Equals(t03.GetType().UnderlyingSystemType));
Console.WriteLine(t04.GetType().Equals(t04.GetType().UnderlyingSystemType));
Console.WriteLine(t05.GetType().Equals(t05.GetType().UnderlyingSystemType));
Console.WriteLine(t06.GetType().Equals(t06.GetType().UnderlyingSystemType));
Console.WriteLine(t07.GetType().Equals(t07.GetType().UnderlyingSystemType));
Console.WriteLine(t08.GetType().Equals(t08.GetType().UnderlyingSystemType));
Console.WriteLine(t09.GetType().Equals(t09.GetType().UnderlyingSystemType));
Console.WriteLine(t10.GetType().Equals(t10.GetType().UnderlyingSystemType));
Console.WriteLine(t11.GetType().Equals(t11.GetType().UnderlyingSystemType));
运行时,我得到了很多真实的信息。
我的问题是,是否存在对象的基础系统类型与其类型不同的情况?这种区别的目的是什么,仅仅是允许定义无法实例化的假设类型?我什至无法使用new关键字创建新的Type。而且Type的所有属性都是get-only,所以我对该功能的用途一无所知。区别在其他语言中有用吗?
最佳答案
Type
是一个抽象类。您将看到的最常见的实现是RuntimeType
,这通常是对象,但是任何人都可以创建Type
的实现。 RuntimeType
的UnderlyingSystemType
只会返回相同的RuntimeType
。据我所知,这仅在您具有采用Type
或在本地构造此类类型的方法的情况下才有意义,而不是在获取对象并调用GetType
的情况下才有意义。这是一个示例,可以帮助您理解:
class Program
{
static void Main(string[] args)
{
// creates a type whose methods and properties are all like Int32, but with an UnderlyingSystemType of string
var type = new MyType(typeof(int));
Console.WriteLine(type.FullName); // prints System.Int32
Console.WriteLine(type.UnderlyingSystemType.FullName); // prints System.String
}
}
class MyType : TypeDelegator //this extends Type, which is an abstract class
{
public MyType(Type t) : base(t) { }
public override Type UnderlyingSystemType
{
get
{
return typeof(string);
}
}
}