鉴于方法:
public static bool IsDateValid(DateTime? date)
{
if (date.HasValue ? date.GetValueOrDefault() < MinDate : false)
{
return false;
}
return date.GetValueOrDefault() < MaxDate;
}
Run Code Online (Sandbox Code Playgroud)
是否可以重写if语句,使其使用null-coalescing运算符?
为什么尝试设置时,我得到一个无效转换异常NULL从数据库里面的返回值Comments是类型Int32.
我想替换这个:
try
{
objStreamItem.Comments = (Int32)sqlReader["Comments"];
if (objStreamItem.Comments > 0) {
listComments = Comment.GetAll(objStreamItem.Id);
}
}
catch (InvalidCastException)
{
// Execute if "Comments" returns NULL
listComments = null;
objStreamItem.Comments = 0;
}
Run Code Online (Sandbox Code Playgroud)
有了这个:
Comments = ((Int32?)sqlReader["Comments"]) ?? 0
Run Code Online (Sandbox Code Playgroud)
这两者在不同的背景下,但你应该得到这个想法.我试图以更优雅的方式解决这个问题,而不是使用try catch块.
谢谢.
它作为可空整数存储在数据库中.
public int? Comments
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
我有一个带字符串属性的类.我在读取它时使用coalesce运算符,因为它可能为null,但它仍然会抛出一个NullRefrenceExeption.
string name = user.Section.ParentSection.Name ?? string.Empty;
Run Code Online (Sandbox Code Playgroud)
更具体地说,它的".ParentSection"是空的,因为它甚至没有".name"?如果是这种情况,我应该先用if块测试".ParentSection"吗?
我假设有一些关于Coalesce运算符的东西,我不明白,希望有人可以了解这里出了什么问题.
我使用Linq从4个级联下拉菜单中返回ID.
用户可能已从1个或所有菜单中选择了1个或多个值.从用户选择中,我然后查询DataTable的文本列以获取代表ID.
如果用户从第4(和最低级别)下拉菜单中进行选择,那么他们将从上述所有选项中进行选择.
如果用户从菜单1中选择"X",从菜单2中选择"Y",而在其他人中没有任何内容我希望看到results110行,其中"X"存在于[Col_1]中,然后将查询说明results2[Col_2]中存在"Y"的5行.
编辑 守则(基本形式)
var results1 =
from a in dt.AsEnumerable()
where stringArray1.Contains([Col1])
select a;
var results2 =
from a in results1
where stringArray2.Contains([Col2])
select a;
var results3 =
from a in results2
where stringArray3.Contains([Col3])
select a;
var results4 =
from a in results3
where stringArray4.Contains([Col4])
select a;
var results = results4 ?? results3 ?? results2 ?? results1;
Run Code Online (Sandbox Code Playgroud)
results4取决于来自results3,results3打开results2和results2打开的结果results1.
它可能results4 - 2 …
问题的标题说明了一切.在C#表达式中a ?? b,b始终是求值,还是仅在a求值时null?
我对此感到好奇,因为在评估右侧表达可能有副作用或评估可能计算成本高昂的情况下,这可能很重要.
我的游乐场代码:
let nickName: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"
Run Code Online (Sandbox Code Playgroud)
嗨,约翰
let informalGreeting2 = "Hi \(fullName ?? nickName)"
Run Code Online (Sandbox Code Playgroud)
嗨可选(“约翰·苹果籽”)
我以为我理解第一种情况
let informalGreeting = "Hi \(nickName ?? fullName)"
Run Code Online (Sandbox Code Playgroud)
nickName 是 nil,所以输出必须是 "Hi \(fullName)" => "Hi John Appleseed"
在第二种情况下
let informalGreeting2 = "Hi \(fullName ?? nickName)"
第一个值 fullName 不是 nil ,所以我认为输出应该是 "Hi \(fullName)" => "Hi John Appleseed"。
但是为什么输出是一个可选的包装输出,就像这里
嗨可选(“约翰·苹果籽”)
我有很多这样的代码
$Var = !empty($Data->title) ? ' string1 ' . $Data->title : ' string2 ' . $Var2;
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了一下,发现?? (Null coalescing operator)
因此,我认为可以做这样的事情
$Var = ' string1 ' . $Data->title ?? ' string2 ' . $Var2;
Run Code Online (Sandbox Code Playgroud)
我问这个是因为我知道??用于isset()或NULL但我需要empty()我的项目代码。
正如您在C# 文档中所看到的,我们可以将 null 合并运算符与 throw 表达式结合起来,如下所示
public string Name
{
get => name;
set => name = value ??
throw new ArgumentNullException(paramName: nameof(value), message: "Name cannot be null");
}
Run Code Online (Sandbox Code Playgroud)
但在很多情况下,如果左值为空,我需要返回语句,例如如下所示
public double CalculateSomthing(ClassType someInstance)
{
var someValue = someInstance?.Value ?? return double.NaN;
// Call some method
AnyMethod(someValue);
// Some Computation
return someValue + 17;
}
Run Code Online (Sandbox Code Playgroud)
但我知道我不能编写类似上面的代码,我的问题是为什么?为什么 C# 语言设计者允许使用 null 合并运算符编写 throw 表达式,但不允许使用带有合并运算符的 return 语句?
它们之间有什么本质区别吗?
在 C# 的现有版本中是否有类似上面示例的类似解决方案?或者我必须编写一些样板代码,如下所示
public double CalculateSomthing(ClassType someInstance)
{
var someValue = someInstance?.Value;
if …Run Code Online (Sandbox Code Playgroud) 嘿伙计们有没有更短的方法来写这一行。
int objectID = jsonObject != null && jsonObject.ObjectID.HasValue && jsonObject.ObjectID.Value > 0 ? jsonObject.ObjectID.Value : defaultObject.ObjectID;
//jsonObject.ObjectID is int?
Run Code Online (Sandbox Code Playgroud)
你可以使用空合并来检查空值和> 0吗?
string o=null;
Console.WriteLine($"Hello World '{o}'");
Run Code Online (Sandbox Code Playgroud)
这输出:
你好世界 ''
我想明确地为空值写“null”。
string o=null;
Console.WriteLine($"Hello World '{o??"null"}'");
Run Code Online (Sandbox Code Playgroud)
这就是这样做的:
你好世界“空”
但如果o不是类型string(或Object),则会生成编译错误。例如:
Array o=null;
Console.WriteLine($"Hello World '{o??"null"}'");
Run Code Online (Sandbox Code Playgroud)
编译错误运算符'??' 不能应用于“Array”和“string”类型的操作数
达到预期结果的最佳方法是什么?遗憾的是您无法修改$句柄的方式null,因为它似乎是硬编码的使用方式String.EmptyString
c# null conditional-operator null-coalescing-operator string-interpolation