相关疑难解决方法(0)

C#中两个问号共同意味着什么?

跨越这行代码:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
Run Code Online (Sandbox Code Playgroud)

这两个问号意味着什么,是某种三元运算符?谷歌很难找到.

c# null-coalescing-operator

1540
推荐指数
16
解决办法
37万
查看次数

好奇的null-coalescing运算符自定义隐式转换行为

注意:这似乎已在Roslyn中修复

写我的回答时,此问题出现了这一个,其中谈到了的关联性空合并运算符.

提醒一下,null-coalescing运算符的概念就是表单的表达式

x ?? y
Run Code Online (Sandbox Code Playgroud)

首先评估x,然后:

  • 如果值为xnull,y则进行求值,这是表达式的最终结果
  • 如果值x是非空,y评估,的值x是表达的最终结果,转换到编译时间类型的后y如果需要的话

现在通常不需要转换,或者它只是从可空类型到非可空类型 - 通常类型相同,或者只是从(比如说)int?int.但是,您可以创建自己的隐式转换运算符,并在必要时使用它们.

对于简单的情况x ?? y,我没有看到任何奇怪的行为.但是,(x ?? y) ?? z我看到一些令人困惑的行为.

这是一个简短但完整的测试程序 - 结果在评论中:

using System;

public struct A
{
    public static implicit operator B(A input)
    {
        Console.WriteLine("A to B");
        return new B();
    }

    public static implicit operator …
Run Code Online (Sandbox Code Playgroud)

c# null-coalescing-operator

535
推荐指数
5
解决办法
2万
查看次数

嵌套泛型:为什么编译器在这种情况下不能推断出类型参数?

当我遇到一个我不理解的类型推断错误时,我正在玩一个爱好项目.我把它简化为以下简单的例子.

我有以下类和函数:

class Foo { }
class Bar { }
class Baz { }

static T2 F<T1, T2>(Func<T1, T2> f) { return default(T2); }
static T3 G<T1, T2, T3>(Func<T1, Func<T2, T3>> f) { return default(T3); }
Run Code Online (Sandbox Code Playgroud)

现在考虑以下示例:

// 1. F with explicit type arguments - Fine
F<Foo, Bar>(x => new Bar());

// 2. F with implicit type arguments - Also fine, compiler infers <Foo, Bar>
F((Foo x) => new Bar());

// 3. G with explicit type arguments - Still fine... …
Run Code Online (Sandbox Code Playgroud)

c# type-inference nested-generics

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

平等运营商 - 总是左联合的,是否重要?

在c#语言规范中,可以找到"除了赋值运算符,所有二元运算符都是左关联的"

但它会为平等运营商带来不同吗?==和!=?

说:bool X,Y,Z ......

return x == Y == z ...依此类推?

即使x,y,z ...的顺序在return语句中有所不同,结果总是相同的,总是返回相同的值吗?(如果x,y,z的init值明显相同)

(x == y)== z等于x ==(Y == z)和(x!= y)== z等于x!=(Y == z)

对?

c# operators

6
推荐指数
3
解决办法
708
查看次数

C#.net中的添加在某些情况下不起作用

我有以下案例

beleg.PreisDB = (double?)orders.Where(x => x.orderId == beleg.auftrnr).Sum(x => x.itemPrice + x.shippingPrice + x.giftWrapPrice) ?? 0;
beleg.PreisCouponDB = (double?)orders.Where(x => x.orderId == beleg.auftrnr).Sum(x => x.itemPromotionDiscount + x.shipPromotionDiscount) ?? 0;
var gesamtPreis = Math.Round(beleg.PreisDB??0 + beleg.PreisCouponDB??0, 2);
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我在调试中添加了一个quickwatch到一些字段:

beleg.PreisDB == 8.39
beleg.PreisDB??0 == 8.39
beleg.PreisCouponDB == -0.49
beleg.PreisCouponDB??0 == -0.49
Run Code Online (Sandbox Code Playgroud)

而现在奇怪的行为也来自快速观察,当然还有结果

beleg.PreisDB??0 + beleg.PreisCouponDB??0 == 8.39
Math.Round(beleg.PreisDB??0 + beleg.PreisCouponDB??0, 2) == 8.39
gesamtPreis == 8.39
Run Code Online (Sandbox Code Playgroud)

所以添加8.39 + -0.49并没有给我7.9但是8.39这个代码在至少有两个600k的情况下运行我有这种行为,其他人表现得很好.我现在不敢看到我的错误.问题是为什么.net表现得像这样?我正在使用Visual Studio 2015和.net 4.5.2.

.net c#

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

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

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

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

两者有什么区别?

c# compiler-construction

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