2013-02-24 3 views
3

Может кто-нибудь объяснить мне, почему следующее определение интерфейса компилируется с ошибкой в ​​Visual Studio 2010?Аргумент атрибута должен быть постоянным выражением

[IncompleteCodePort(SourceOriginType.Other, "This should be a GL abstraction depending on what OpenGL API will be used")] 
    public interface IGL 
    { 
     /// <summary> 
     /// Returns true if provided function is available or supported by graphics API 
     /// </summary> 
     /// <param name="funcName"></param> 
     /// <returns></returns> 
     bool IsFunctionAvailable(string funcName); 

     /// <summary> 
     /// Returns true if provided function is supported as extension by graphics API 
     /// </summary> 
     /// <param name="funcName"></param> 
     /// <returns></returns> 
     bool IsExtensionAvailable(string funcName); 
    } 



public class IncompleteCodePortAttribute : Attribute 
    { 
     public SourceOriginType SourceOriginType { get; private set; } 
     public string SourceUrl { get; private set; } 
     public string Reason { get; private set; } 


     public IncompleteCodePortAttribute(SourceOriginType originType, string reason, string sourceUrl = null) 
     { 
      SourceOriginType = originType; 
      SourceUrl = sourceUrl; 
      Reason = reason; 
     } 
    } 

    public enum SourceOriginType 
    { 
     CodePlex, 
     WorldWindJdk, 
     StackOverflow, 
     Other 
    } 

и ошибок я получаю:

Атрибут аргумент должен быть константным выражением, TypeOf выражение создания выражение или массив типа параметра атрибута

Если я удалить пользовательский атрибут, я не получаю ошибок компиляции.

+1

Что такое 'IncompleteCodePort'? Опубликуйте все его конструкторы. – Nawaz

+0

Я смог скомпилировать с помощью фиктивного класса IncompleteCodePort. Я считаю, что вам не хватает информации здесь. – Manish

+0

Если вы используете 'Enum' в классе' IncompleteCodePort', не делайте этого. Вместо этого используйте 'SourceOriginType'. – Corey

ответ

2

Это похоже на ошибку в компиляторе C# в VS2010 (код компилируется под VS2012). Похоже, что компилятор не обрабатывает значение null в качестве значения по умолчанию параметра.

Этот код не компилируется:

[IncompleteCodePort()] 
interface IGL 
{} 

class IncompleteCodePortAttribute : Attribute 
{ 
    public IncompleteCodePortAttribute(string sourceUrl = null) 
    {} 
} 

с сообщением упомянутой ошибки («Аргумент атрибута должен быть константным выражением, TypeOf выражения создания выражения или массива атрибут типа параметра»), но смешения без расположения исходного кода.

Некоторые примеры декларации атрибута, которые делают работу:

class IncompleteCodePortAttribute : Attribute 
{ 
    public IncompleteCodePortAttribute(string sourceUrl = "") 
    {} 
} 
class IncompleteCodePortAttribute : Attribute 
{ 
    private const string Null = null; 

    public IncompleteCodePortAttribute(string sourceUrl = Null) 
    {} 
} 
class IncompleteCodePortAttribute : Attribute 
{ 
    public IncompleteCodePortAttribute() 
     : this(null) 
    {} 

    public IncompleteCodePortAttribute(string sourceUrl) 
    {} 
} 
+0

Спасибо. Как ни странно, я открыл решение в VS2012, вернулся в VS2010 и перезагрузился, теперь он компилируется. –

+0

Он сделал это, теперь он не компилируется. Я просто удалил необязательный конструктор и перегрузил конструктор. Благодарю. –

+1

См. Http://stackoverflow.com/questions/8290853/attribute-argument-must-be-a-constant-error-when-using-an-optional-parameter-in –

Смежные вопросы

 Смежные вопросы