是否可以将IsNullOrEmpty
与可空类型一起使用?当将IsNullOrEmpty
与string? RunDate
一起使用时,上面的代码会生成构建错误
public int MyMethod(string? RunDate = null)
{
string sql = string.Empty;
int rowsChanged = -1;
if (String.IsNullOrEmpty(RunDate))
{
//do stuff
}
}
答案 0 :(得分:2)
您似乎打算像在TypeScript中那样使用decimal?
,它暗示一个可选值;但是在C#中并非如此。在C#中,?
语法是T?
的简写。 Nullable<T>
结构对Nullable<T>
有约束,因此T
也必须是结构。 T
是System.String
而不是class
,因此不能与struct
一起使用。
Nullable<T>
的目的是包含类型Nullable<T>
或T
的值,因为基于null
的值本身不能为null引用。所有基于struct
的值都已经可以包含空引用,因此将它们与class
一起使用是没有意义的。
尝试像这样重写代码:
Nullable<T>
答案 1 :(得分:1)
这行必须是string? RunDate = null
。您无需将字符串声明为可为空的类型string?
,因为string
本身是引用类型,因此默认为null
。可以只是
public int MyMethod(string RunDate = null)
{
// rest of code
}
答案 2 :(得分:0)
快速回答,不。
还没有答案。
现在,在发布C#8之前(只要您不使用C#8预览),用于指定可为空的引用类型的?
符号是语法错误。让我们暂时忽略C#8。
type?
转换为Nullable<type>
,并且Nullable<T>
结构的声明如下:
public struct Nullable<T> where T : struct
换句话说,T
不能为string
,因此string?
是不合法的。这就是给您语法错误的原因。
在C#8发布之前,或者您开始使用C#8 Preview之前,除了删除问号,您无能为力。
发布C#8会发生什么?
好吧,对于引用类型 来说,type?
不会转换为Nullable<T>
,而是会转换为T
并具有可空性知识。对于字段,属性,参数,返回类型,基本上不是局部变量的任何内容,都将转换为带有属性的声明,该属性说明可为空性。对于局部变量,编译器将跟踪可为空性。
因此,在这种情况下,string.IsNullOrEmpty
实际上可以工作,因为参数从根本上仍然是字符串,它将只是具有附加可空性知识的字符串。
答案 3 :(得分:-2)
?
运算符用于将不可为null的类型声明为可为null,并且编译器将其编译为Nullable<T>
类型。
System.String
是引用类型,因此可以为空。
删除?
运算符,一切正常。