Какая комбинация общих ограничений параметров заставит компилятор C # генерировать строки для таблицы метаданных GenericParamConstraint? - PullRequest
5 голосов
/ 05 апреля 2011

В соответствии со спецификацией метаданных Раздела II для таблицы GenericParamConstraint для CLR,

В таблице GenericParamConstraint записываются ограничения для каждого универсального параметра.Каждый общий параметр может быть ограничен для получения от нуля или одного класса.Каждый универсальный параметр может быть ограничен для реализации нуля или более интерфейсов.

Проблема в том, что я не могу найти правильный фрагмент кода C #, чтобы компилятор C # генерировал одну строку в GenericParamConstraintТаблица.Я попытался использовать

    public interface IFoo
    {
    }

    public interface IBaz
    {
    }

    public interface IBar
    {
    }
    public class Foo
    {

    }
    public class SampleClassWithGenericParamConstraint<T>
        where T : IFoo, IBaz, new()
    {
        public void DoSomething<U>(U arg1)
            where U : struct
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }

.. но проблема в том, что компилятор C # генерирует только строки для таблицы GenericParam вместо добавления строк для таблицы GenericParamConstraint.Итак, вот мой вопрос - есть ли пример кода, написанный на C #, который заставил бы компилятор C # добавить строку метаданных в таблицу GenericParamConstraint, чтобы я мог использовать образец двоичного файла?И если это какое-то ограничение со стороны компилятора C #, есть ли эквивалентный фрагмент ILASM, который вместо этого будет выполнять эту работу?

1 Ответ

3 голосов
/ 05 апреля 2011

Вы должны быть смущены, точный код, который вы опубликовали, скомпилированный с csc, приводит к трем строкам в таблице GenericParamConstraint.

enter image description here

В этом контексте GenericParam U имеет токен 2a000001 и ограничен System.ValueType TypeRef.T (2a00000a) ограничено типами IFoo и IBaz.

...