Это пахнет как ошибка компилятора для меня.Классы атрибутов являются «специальными» классами в том смысле, что их можно использовать в качестве метаданных.Компилятор C # позволяет вам использовать их не так, как обычные классы, и поэтому мы можем предположить, что в компиляторе C # существует (частичная) специальная реализация для компиляции использования классов атрибутов.(Кто-нибудь может проверить это на моно?)
Тем не менее, я провел несколько тестов и обнаружил, что только при использовании конструктора атрибута, который задает значение параметра по умолчанию как ноль, не определяя пользовательское значение этогоатрибут, компилятор выдает нам ошибку.Мой тестовый код:
class TestAttribute : Attribute
{
public TestAttribute(object test = null) { }
//public TestAttribute(int test = 0) { }
public void TestMethod(object test = null) { }
}
class TestClass
{
public TestClass(object test = null) { }
}
[Test()] // crashes
//[Test()] // Works when using the constructor taking an int
//[Test(null)] // works
class Program
{
static void Main(string[] args)
{
TestClass t = new TestClass(); // works
TestAttribute a = typeof(Program).GetCustomAttributes(typeof(TestAttribute), false).Cast<TestAttribute>().First();
a.TestMethod(); // works
}
}
(Протестировано с VS 2010 в .NET 4.0, кто-нибудь может проверить это с моно?)
Обратите внимание, что атрибуты уже позволяют вам обращаться к свойствам, как если бы они былинеобязательный, так что вы можете сделать ваш необязательный параметр свойством (если это еще не сделано, и удалить его из конструктора. Это по-прежнему позволяет писать [Test (null, MyProperty = null)]