C# вводят спецификацию параметров

Некоторый специальный 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#?

11
задан Qantas 94 Heavy 1 May 2014 в 09:16
поделиться

4 ответа

Во-первых, Джон снова правильно - эти парни очень особые типы , значения которых не конвертируются для объекта, и поэтому не могут использоваться в качестве аргументов типа. Все аргументы типа должны быть типами, значениями которых конвертируются для объекта.

Чтобы ответить на ваш вопрос о документации:

Ни одна из специальных функций для обработки вариационных методов документирована. Они не являются частью самого языка C # - соответствующий реализация языка не требуется, чтобы иметь возможность взаимодействовать с языками, которые поддерживают вариационные методы. Эти функции не документируются в MSDN в рамках документации компилятора. Это не «официально поддерживаемые» функции.

Это несчастный, но имеется только столько бюджета, и я думаю, что большинство людей согласится с тем, что мы сделаем лучше, чтобы написать функции и исправить ошибки, чем тратить функции документирования денег, которые буквально 99,9% наших пользователей никогда не будут, когда-либо использовать даже если они были поддержаны, которые они не.

Если вы хотите пойти, сделайте взаимодействие в C # с вариационными методами, вы сами по себе. Удачи!

10
ответ дан 3 December 2019 в 05:58
поделиться

Я считаю, что это потому, что эти типы «специальные» в том, что они не могут быть преобразованы в объект ; Только типы, которые могут быть преобразованы в объект , могут быть указаны в качестве аргументов типа. То же самое верно для указателей, кстати.

Я не могу найти, где это задокументировано (он задокументирован для указателей в 4.4.1), но Эрик Липперт упомянул его в комментарии на днях.

Это просто вопрос интереса, или вы пытаетесь на самом деле сделать что-то, используя такую ​​вещь?

7
ответ дан 3 December 2019 в 05:58
поделиться

Все три примера, которые вы предоставили, являются структурами, а не классы, поэтому я подозреваю, что это ключ к проблеме. Пример, предусмотренный в документации на сообщение об ошибке компилятора .

1
ответ дан 3 December 2019 в 05:58
поделиться

Раздел 8.2.4 из CLI SPEC Типы значений вызовов, которые могут содержать указатели в стек оценки «Byref-Alks», и говорит, что они не могут быть в штучной упаковке. Это явно вызывает System.runtimeargumentHandle и System.Typerreference в качестве примеров таких типов, но не обеспечивает исчерпывающий список. Раздел 9.4 продолжает указывать, что виды ByRef, ByREF-подобные типы и System.Void не могут быть использованы для создания родов или методов.

1
ответ дан 3 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: