我在Nullable隐式转换之间的交互中遇到了一些有趣的行为.我发现从值类型提供引用类型的隐式转换,它允许Nullable在我反对期望编译错误时将类型传递给需要引用类型的函数.以下代码演示了这一点:
static void Main(string[] args)
{
PrintCatAge(new Cat(13));
PrintCatAge(12);
int? cat = null;
PrintCatAge(cat);
}
private static void PrintCatAge(Cat cat)
{
if (cat == null)
System.Console.WriteLine("What cat?");
else
System.Console.WriteLine("The cat's age is {0} years", cat.Age);
}
class Cat
{
public int Age { get; set; }
public Cat(int age)
{
Age = age;
}
public static implicit operator Cat(int i)
{
System.Console.WriteLine("Implicit conversion from " + i);
return new Cat(i);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
The cat's age …Run Code Online (Sandbox Code Playgroud) null coalescing运算符是右关联的,表示表单的表达式
第一个?第二个 - 第三个
被评估为
第一个?(第二次 - 第三次)
基于上述规则,我认为以下翻译是不正确的.
从:
Address contact = user.ContactAddress;
if (contact == null)
{
contact = order.ShippingAddress;
if (contact == null)
{
contact = user.BillingAddress;
}
}
Run Code Online (Sandbox Code Playgroud)
至:
Address contact = user.ContactAddress ??
order.ShippingAddress ??
user.BillingAddress;
Run Code Online (Sandbox Code Playgroud)
相反,我认为以下是正确的(如果我错了请纠正我)
Address contact = (user.ContactAddress ?? order.ShippingAddress) ??
user.BillingAddress;
Run Code Online (Sandbox Code Playgroud) 最近,我观看了一些关于C#异步错误的视频,并与朋友们进行了讨论.
说编程语言有错误是否正确?或者你只能说编译器有bug吗?
两者有什么区别?
来自C#我必须用PHP做一个项目.
我正在使用此代码:
$transport = 'T';
$vehicle = (
( $transport == 'B' ) ? 'bus' :
( $transport == 'A' ) ? 'airplane' :
( $transport == 'T' ) ? 'train' :
( $transport == 'C' ) ? 'car' :
( $transport == 'H' ) ? 'horse' :
'feet' );
echo $vehicle;
Run Code Online (Sandbox Code Playgroud)
我希望它可以打印train,但我明白了horse.键盘示例:http://codepad.org/rWllfrht
谁能解释这种奇怪的行为?
例如,给定此代码:
int? ReallyComplexFunction()
{
return 2; // Imagine this did something that took a while
}
void Something()
{
int i = ReallyCleverFunction() ?? 42;
}
Run Code Online (Sandbox Code Playgroud)
...是否保证只调用一次该函数?在我的测试中,它只被调用一次,但是我看不到任何文档说明我可以依赖它总是如此.
编辑
我猜它是如何实现的,但来吧:我们是开发人员.我们不应该在猜测和假设上混淆.例如,将来所有的实现都是一样的吗?另一个平台的语言实现是否相同?这取决于语言的规格以及它提供的保证.例如,未来或不同的平台实现(不是一个好的,但它可能)可以在??实现中执行此操作:
return ReallyComplexFunction() == null ? 42 : ReallyComplexFunction();
Run Code Online (Sandbox Code Playgroud)
ReallyComplexFunction如果它没有返回,那将会调用两次null.(虽然这看起来可笑的实现,如果你有一个可为空的变量替换功能,它看起来相当合理:return a == null ? 42 : a)
如上所述,我知道在我的测试中它只被调用一次,但我的问题是C#规范是否保证/指定左侧只调用一次?如果是的话,在哪里?我在C#语言规范中看不出任何这样的提及?运算符(我最初寻找我的查询的答案).
该方法是否在左侧?C#中的运算符被调用两次?一次进行评估,一次进行分配?
在以下行中:
int i = GetNullableInt() ?? default(int);
Run Code Online (Sandbox Code Playgroud)
我假设GetNullableInt()首先需要调用该方法,因此可以在进行赋值之前评估结果.如果没有发生这种情况,则需要分配变量"i"然后进行评估,这对接收分配的项目来说似乎是危险的,因为在对象分配期间,理论上可以在第一阶段过早地为其分配空值.将其替换为右侧方法的结果.