Что означает [param: NotNull] в C#?


в исходном коде Entity Framework (ссылке) Я нашел эту строку:

public virtual IRelationalTransaction Transaction 
{ get; [param: NotNull] protected set; }

The [param: NotNull] часть выглядит очень странно для меня. Есть идеи, что это за синтаксис C#? Я знаком с атрибутами и парам, но не с этой комбинацией.

определение NotNull таково:

[AttributeUsage(
    AttributeTargets.Method | AttributeTargets.Parameter |
    AttributeTargets.Property | AttributeTargets.Delegate |
    AttributeTargets.Field)]
internal sealed class NotNullAttribute : Attribute
{
}

который я ожидал использовать просто как [NotNull] но что такое param здесь делаешь?

2 54
c#

2 ответа:

когда вы отмечаете метод с NotNull это означает, что метод возвращает не null объекта:

[NotNull]
public object Get()
{
    return null; //error
}

когда вы отмечаете setter, он делает то же самое - setter возвращает not null (потому что .net преобразует свойства В методы get и set).

public virtual IRelationalTransaction Transaction { get; [NotNull] protected set; }

равен:

[NotNull] 
public virtual void set_Transaction(IRelationalTransaction value) { ... }

Итак, вам нужно добавить param: чтобы указать, что "я имею в виду-параметр сеттера не является нулем, а не результатом set-method":

public virtual IRelationalTransaction Transaction { get; [param: NotNull] protected set; }

равен:

public virtual void set_Transaction([NotNull] IRelationalTransaction value) { ... }

param: - это атрибут target. Смотрите:17.2 атрибут спецификация

атрибут target может быть одним из следующих:

сборка, модуль, поле, событие, метод, параметр, свойство, отдача, типа

так [param: NotNull] означает, что NotNullAttribute относится к