Почему C # запрещает универсальные типы атрибутов?

Следующее вычисляет отношение позиции мыши к элементу canvas:

var example = document.getElementById('example'); 
example.onmousemove = function(e) { 
    var x = e.pageX - this.offsetLeft; 
    var y = e.pageY - this.offsetTop; 
}

В этом примере this относится к элементу example, а e - событие onmousemove .

485
задан Deduplicator 31 January 2015 в 15:31
поделиться

4 ответа

Ну, я не могу ответить, почему это не доступно, но я могу подтверждать, что это не проблема CLI. Спецификация CLI не упоминает его (насколько я вижу), и если Вы используете IL непосредственно, можно создать универсальный атрибут. Часть спецификации C# 3, которая запрещает его - разделяет 10.1.4 "Спецификации основы класса", не дает выравнивания.

аннотируемая спецификация ECMA C# 2 не дает полезной информации также, хотя это действительно обеспечивает пример того, что не позволяется.

Моя копия аннотируемой спецификации C# 3 должна прибыть завтра... Я буду видеть, дает ли это больше информацию. Так или иначе это - определенно решение языка, а не во время выполнения.

РЕДАКТИРОВАНИЕ: Ответ от Eric Lippert (перефразировал): никакая конкретная причина, кроме избежать сложности и на языке и на компиляторе для варианта использования, который не добавляет много значения.

341
ответ дан Jon Skeet 31 January 2015 в 15:31
поделиться

Атрибут украшает класс во время компиляции, но универсальный класс не получает свою заключительную информацию о типе до времени выполнения. Так как атрибут может влиять на компиляцию, это должно быть "завершено" во время компиляции.

Посмотрите этот статья MSDN для получения дополнительной информации.

82
ответ дан GalacticCowboy 31 January 2015 в 15:31
поделиться

Я не знаю, почему это не позволяется, но это - одно возможное обходное решение

[AttributeUsage(AttributeTargets.Class)]
public class ClassDescriptionAttribute : Attribute
{
    public ClassDescriptionAttribute(Type KeyDataType)
    {
        _KeyDataType = KeyDataType;
    }

    public Type KeyDataType
    {
        get { return _KeyDataType; }
    }
    private Type _KeyDataType;
}


[ClassDescriptionAttribute(typeof(string))]
class Program
{
    ....
}
18
ответ дан GeekyMonkey 31 January 2015 в 15:31
поделиться

Это - очень хороший вопрос. По моему опыту, с атрибутами, я думаю, что ограничение существует потому что, когда размышляющий над атрибутом оно создало бы условие, в котором необходимо будет проверить на все возможные перестановки типа: typeof(Validates<string>), typeof(Validates<SomeCustomType>), и т.д.

, По-моему, если пользовательская проверка требуется в зависимости от типа, атрибут не может быть лучшим подходом.

, Возможно, класс проверки, который берет в SomeCustomValidationDelegate или ISomeCustomValidator в качестве параметра, был бы лучшим подходом.

8
ответ дан ichiban 31 January 2015 в 15:31
поделиться
Другие вопросы по тегам:

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