Нет, это не работает. Параметрические типы общего набора (или другого общего) в C# должны быть декларируемыми типами, а атрибуты существуют только как метаданные.
У вас не может быть объекта типа FooAssignable. У вас может быть объект с атрибутом FooAssignable, но это не то же самое, что иметь его как супертип. FooAssignable не является классом или интерфейсом и не является допустимым спецификатором типа. FooAssignableAttribute есть, но это тот тип, который относится к самому атрибуту, а не к элементам, помеченным этим атрибутом.
Учтите, что в словаре тип out для индексатора - это тип вывода, который вы предоставили. Но вы не можете иметь переменную типа FooAssignable - вы можете иметь переменную типа, помеченного FooAssignable, но нет единого базового класса, который бы соответствовал всем этим типам. Поскольку это объявление типа является незаконным, этот словарь будет иметь незаконный, несуществующий тип в качестве возвращаемого типа для получателя из его индексатора, среди многих других мест. Проверка типа C# не может быть заменена спонтанно с помощью общих механизмов с проверкой наличия атрибута.
Все, что вы хотите, чтобы система типов проверяла вас, должна быть частью системы типов. Оценка атрибутов не определяет типы, поэтому система типов не может этого сделать для вас; Между тем, дженерики являются частью языка, который наиболее непосредственно взаимодействует с системой типов. Вам нужно будет пройти через систему типов, чтобы выполнить такую проверку, и это означает, что вместо этого FooAssignableAttribute будет использовать интерфейс (IFooAssignable?).
Вы не можете этого сделать. Атрибуты не являются частью системы типов C#, и это не является ограничением, которое вы можете сделать. Почему вам нужно выразить это ограничение на основе атрибутов? – millimoose
И? поэтому вы этого не хотите, но это то, что нужно сделать ... в чем вопрос? –
Я отформатировал ваши образцы кода для вас. Для дальнейшего использования в образцах кода необходимо отформатировать четыре пробела для правильной отображения (или вы можете использовать кнопку '{}' над полем редактирования). –