Учитывая класс с неявным оператором преобразования в Guid
:
class MyId
{
private readonly Guid innerGuid;
public MyId(Guid innerGuid)
{
this.innerGuid = innerGuid;
}
public static implicit operator Guid(MyId id)
{
return id.innerGuid;
}
}
При назначении на Nullable<Guid>
:
static void Main(string[] args)
{
MyId someId = null;
Guid? optionalId = someId;
Console.WriteLine("optionalId = " + (optionalId.HasValue ? optionalId.Value.ToString() : "NULL"));
}
Я ожидаю, что нулевая ссылка будет просто распространяться от someId
до optionalId
. т.е. получить вывод консоли:
необязательный идентификатор = NULL
Однако компилятор, похоже, имеет приоритет над внутренним типом Guid Nullable и пытается выполнить неявное преобразование, которое выдает NRE, поскольку параметр id
явно равен нулю.
Это ошибка или так задумано?
Это можно исправить с помощью оператора объединения null и явного значения null:
static void Main(string[] args)
{
MyId someId = null;
Guid? optionalId = someId ?? (Guid?) null;
Console.WriteLine("optionalId = " + (optionalId.HasValue ? optionalId.Value.ToString() : "NULL"));
}
Но это кажется очень странным. Resharper даже затушевывает его, подразумевая, что он не нужен, и заявляет:
'???' правый операнд всегда нулевой
optionalId = (MyId)null
посмотреть, выдает это или нет. В настоящее время нуль, приведенный к guid, очевидно, не вызывает ваш неявный оператор, который принимает MyId - person M.kazem Akhgary   schedule 24.10.2015Nullable<Guid>
действительно исправляет этот случай. К сожалению, мой реальный случай не так прост (общий базовый классIdentity<TId>
, который может использовать Guid, int, string и т. д. Добавление неявного преобразования вNullable<TId>
означает, что я должен датьTId
ограничение структуры, что означает, что я больше не могу использовать Identity <нить>) - person Tyson   schedule 24.10.2015Guid?
, правая сторона -MyId
. У меня есть неявное преобразование изMyId
->Guid
, но неMyId
->Guid?
, так почему же оно должно запускать ненулевое преобразование, когда копирование нулевой ссылки является полностью допустимой операцией? - person Tyson   schedule 24.10.2015