Некоторый специальный CLI вводит из mscorlib библиотеки (ArgIterator
, TypedReference
и RuntimeArgumentHandle
типы), не может использоваться в качестве универсальных параметров типа для построения универсальных типов / методы:
void Foo<T>() { }
void Bar() { Foo<ArgIterator>(); }
обеспечивает ошибку компилятора:
error CS0306: The type 'System.ArgIterator' may not be used as a type argument
Но это не документируется вообще в спецификации C#.
Это, вводит, часть спецификации CLI, или это вводит обеспеченный реализацией CLR, и поведение, описанное выше, не должно быть зарегистрировано в спецификации C#?
Во-первых, Джон снова правильно - эти парни очень особые типы , значения которых не конвертируются для объекта, и поэтому не могут использоваться в качестве аргументов типа. Все аргументы типа должны быть типами, значениями которых конвертируются для объекта.
Чтобы ответить на ваш вопрос о документации:
Ни одна из специальных функций для обработки вариационных методов документирована. Они не являются частью самого языка C # - соответствующий реализация языка не требуется, чтобы иметь возможность взаимодействовать с языками, которые поддерживают вариационные методы. Эти функции не документируются в MSDN в рамках документации компилятора. Это не «официально поддерживаемые» функции.
Это несчастный, но имеется только столько бюджета, и я думаю, что большинство людей согласится с тем, что мы сделаем лучше, чтобы написать функции и исправить ошибки, чем тратить функции документирования денег, которые буквально 99,9% наших пользователей никогда не будут, когда-либо использовать даже если они были поддержаны, которые они не.
Если вы хотите пойти, сделайте взаимодействие в C # с вариационными методами, вы сами по себе. Удачи!
Я считаю, что это потому, что эти типы «специальные» в том, что они не могут быть преобразованы в объект
; Только типы, которые могут быть преобразованы в объект
, могут быть указаны в качестве аргументов типа. То же самое верно для указателей, кстати.
Я не могу найти, где это задокументировано (он задокументирован для указателей в 4.4.1), но Эрик Липперт упомянул его в комментарии на днях.
Это просто вопрос интереса, или вы пытаетесь на самом деле сделать что-то, используя такую вещь?
Все три примера, которые вы предоставили, являются структурами, а не классы, поэтому я подозреваю, что это ключ к проблеме. Пример, предусмотренный в документации на сообщение об ошибке компилятора .
Раздел 8.2.4 из CLI SPEC Типы значений вызовов, которые могут содержать указатели в стек оценки «Byref-Alks», и говорит, что они не могут быть в штучной упаковке. Это явно вызывает System.runtimeargumentHandle
и System.Typerreference
в качестве примеров таких типов, но не обеспечивает исчерпывающий список. Раздел 9.4 продолжает указывать, что виды ByRef, ByREF-подобные типы и System.Void не могут быть использованы для создания родов или методов.