3

我已经阅读了“UnderlyingSystemType”的定义,即它“表示由公共语言运行时提供的表示该类型的类型”。

关于 SO 有一个相关链接,即 UnderlyingSystemType 何时与当前的 Type 实例不同,但我无法从答案中判断是否真的有可能拥有一个类型与 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 的所有属性都是 get-only,所以我不知道这个功能的作用。这种区别在其他语言中有用吗?

4

1 回答 1

3

Type是一个抽象类。您将看到的最常见的实现是RuntimeType,这是通常的对象,但任何人都可以创建Type. RuntimeTypeUnderlyingSystemType将返回相同的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);
        }
    }
}
于 2012-11-25T14:39:44.570 回答