可空类型的IsNullOrEmpty的替代品?

时间:2019-05-16 20:01:05

标签: c# asp.net visual-studio-2010

是否可以将IsNullOrEmpty与可空类型一起使用?当将IsNullOrEmptystring? RunDate一起使用时,上面的代码会生成构建错误

    public int MyMethod(string? RunDate = null)
    {

        string sql = string.Empty;
        int rowsChanged = -1;
        if (String.IsNullOrEmpty(RunDate))
        {
            //do stuff
        }
     }

4 个答案:

答案 0 :(得分:2)

您似乎打算像在TypeScript中那样使用decimal?,它暗示一个可选值;但是在C#中并非如此。在C#中,?语法是T?的简写。 Nullable<T>结构对Nullable<T>有约束,因此T也必须是结构。 TSystem.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是引用类型,因此可以为空。

删除?运算符,一切正常。