Открих странно поведение на моята програма и след допълнителен анализ успях да открия, че вероятно нещо не е наред или в познанията ми за C#, или някъде другаде. Вярвам, че грешката е моя, но никъде не мога да намеря отговор...
public class B
{
public static implicit operator B(A values)
{
return null;
}
}
public class A { }
public class Program
{
static void Main(string[] args)
{
A a = new A();
B b = a ?? new B();
//b = null ... is it wrong that I expect b to be B() ?
}
}
The variable "b" in this code is evaluated to null. I don't get why is it null.
Търсих в Google и намерих отговор в този въпрос - Имплицитно кастинг на резултат от оператор Null-Coalescing - с официалната спецификация.
Но следвайки тази спецификация, не мога да намеря причината, поради която "b" е нула :( Може би го чета погрешно, в който случай се извинявам за спама.
Ако A съществува и не е nullable тип или референтен тип, възниква грешка по време на компилиране.
...това не е така.
Ако b е динамичен израз, типът резултат е динамичен. По време на изпълнение първо се оценява a. Ако a не е нула, a се преобразува в динамично и това става резултатът. В противен случай b се оценява и това става резултатът.
...това също не е така.
В противен случай, ако A съществува и е nullable тип и съществува неявно преобразуване от b към A0, типът резултат е A0. По време на изпълнение първо се оценява a. Ако a не е null, a се разопакова до тип A0 и това става резултатът. В противен случай b се оценява и преобразува в тип A0 и това става резултатът.
...A съществува, неявното преобразуване от b в A0 не съществува.
В противен случай, ако A съществува и съществува неявно преобразуване от b към A, типът резултат е A. По време на изпълнение първо се оценява a. Ако a не е нула, a става резултат. В противен случай b се оценява и преобразува в тип A и това става резултатът.
...A съществува, неявното преобразуване от b в A не съществува.
В противен случай, ако b има тип B и съществува неявно преобразуване от a към B, типът резултат е B. По време на изпълнение първо се оценява a. Ако a не е null, a се разопакова до тип A0 (ако A съществува и е nullable) и се преобразува в тип B, и това става резултатът. В противен случай b се оценява и става резултат.
...b има тип B и съществува имплицитно преобразуване от a към B. a се оценява като нула. Следователно b трябва да бъде оценено и b трябва да бъде резултатът.
В противен случай a и b са несъвместими и възниква грешка по време на компилиране. Не става
Пропускам ли нещо, моля?
B b = (B)a ?? new B();
, т.е. напишете имплицитното предаване изрично в кода, това има значение. - person Jeppe Stig Nielsen   schedule 27.01.2014