Как узнать, что конкретный Type ссылочный?
От: alexzzzz  
Дата: 14.01.20 17:30
Оценка:
Вопрос праздный, возник случайно.

1. Что нужно написать вместо ???, чтобы для ссылочных типов ответ был True?

using System;

class Program
{
    static void Main()
    {
        Print(typeof(int));
        Print(typeof(int*));
        Print(typeof(int[]));
    }

    static void Print(Type type)
    {
        Console.WriteLine($"{type.Name} is a value-type: {type.IsValueType}");
        Console.WriteLine($"{type.Name} is a pointer-type: {type.IsPointer}");
        Console.WriteLine($"{type.Name} is a reference-type: {type.???}"); // <----- ???
        Console.WriteLine();
    }
}


Можно конечно перебором. По спецификации, к ссылочным типам относятся массивы, делегаты, интерфейсы и классы (в том числе string, object и dynamic). Если что-то из этого, то тип ссылочный. Но вдруг в C# 12 добавят что-то ещё ссылочное.

Можно методом исключения: если не value-тип и не указатель, значит ссылочный тип. Но вдруг в C# 13 появится четвёртый, доселе неизвестный тип типов.

2. Что такое Type.IsByRef ?

Справка говорит как-то расплывчато. Непонятно, что это означает:

Gets a value indicating whether the Type is passed by reference.

Remarks
To get to the actual type, dereference the type that was passed by reference, and then call GetElementType on that type.


Там даже есть пример кода, из которого вроде кажется, что IsByRef как раз должен возвращать true для ссылочных типов. Но он так не работает: для массивов и для классов возвращает false.
Отредактировано 14.01.2020 17:33 alexzzzz . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.