跨越这行代码:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
Run Code Online (Sandbox Code Playgroud)
这两个问号意味着什么,是某种三元运算符?谷歌很难找到.
注意:这似乎已在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) 当我遇到一个我不理解的类型推断错误时,我正在玩一个爱好项目.我把它简化为以下简单的例子.
我有以下类和函数:
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#语言规范中,可以找到"除了赋值运算符,所有二元运算符都是左关联的"
但它会为平等运营商带来不同吗?==和!=?
说: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)
对?
我有以下案例
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.
最近,我观看了一些关于C#异步错误的视频,并与朋友们进行了讨论.
说编程语言有错误是否正确?或者你只能说编译器有bug吗?
两者有什么区别?