相关疑难解决方法(0)

隐式转换运算符对此Nullable <T>行为的理由是什么?

我在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)

.net c# nullable implicit-conversion

32
推荐指数
1
解决办法
620
查看次数

null合并运算符的右关联如何表现?

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#

29
推荐指数
3
解决办法
2498
查看次数

编程语言错误或编译器错误?

最近,我观看了一些关于C#异步错误的视频,并与朋友们进行了讨论.

说编程语言有错误是否正确?或者你只能说编译器有bug吗?

两者有什么区别?

c# compiler-construction

3
推荐指数
1
解决办法
267
查看次数

奇怪的行为三元运算符

来自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

谁能解释这种奇怪的行为?

php

2
推荐指数
1
解决办法
2105
查看次数

是?? 运算符保证只运行左侧参数一次?

例如,给定此代码:

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#语言规范中看不出任何这样的提及运算符(我最初寻找我的查询的答案).

.net c#

1
推荐指数
1
解决办法
205
查看次数

C#?? 操作员被叫两次?

该方法是否在左侧?C#中的运算符被调用两次?一次进行评估,一次进行分配?

在以下行中:

int i = GetNullableInt() ?? default(int);
Run Code Online (Sandbox Code Playgroud)

我假设GetNullableInt()首先需要调用该方法,因此可以在进行赋值之前评估结果.如果没有发生这种情况,则需要分配变量"i"然后进行评估,这对接收分配的项目来说似乎是危险的,因为在对象分配期间,理论上可以在第一阶段过早地为其分配空值.将其替换为右侧方法的结果.

?? 运算符(C#参考)

c#

0
推荐指数
2
解决办法
567
查看次数