【问题标题】:C# nullable string errorC# 可空字符串错误
【发布时间】:2010-09-16 06:56:18
【问题描述】:
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

在后面的代码中我是这样使用的:

typeOfContract = Request.QueryString["type"];

我在声明typeOfContract 行时收到以下错误:

类型“字符串”必须是不可为空的值类型才能使用 它作为泛型类型或方法中的参数“T” 'System.Nullable'

有什么想法吗?基本上,我想在执行操作之前确保"type" 存在于QueryString 中。

【问题讨论】:

    标签: c# nullable


    【解决方案1】:

    System.String 是一个引用类型并且已经“可以为空”。

    Nullable 和 ?后缀用于值类型,例如 Int32、Double、DateTime 等。

    【讨论】:

    • 需要注意的一点:Nullable 本身就是一个值类型,但是“struct”泛型类型约束只包括不可为空的值类型——所以你不能做 Nullable>.
    • 在 C# 8.0 中,引用类型可能被标记为可为空。可以键入string? 告诉全世界这个字符串可能为空。参考:youtube.com/watch?v=VdC0aoa7ung
    【解决方案2】:

    你让事情变得复杂了。 string 已经可以为空。您不需要使其更多可以为空。取出属性类型上的?

    【讨论】:

      【解决方案3】:

      string 不能作为 Nullable 的参数,因为 string 不是值类型。字符串是引用类型。

      string s = null; 
      

      是一个非常有效的语句,不需要使其可以为空。

      private string typeOfContract
          {
            get { return ViewState["typeOfContract"] as string; }
            set { ViewState["typeOfContract"] = value; }
          }
      

      应该因为 as 关键字而起作用。

      【讨论】:

        【解决方案4】:

        String 是一种引用类型,因此您不需要(也不能)在此处使用Nullable<T>。只需将 typeOfContract 声明为字符串,并在从查询字符串中获取 null 后简单地检查它。或者,如果您想处理与 null 相同的空字符串值,请使用 String.IsNullOrEmpty。

        【讨论】:

          【解决方案5】:

          对于可空值,将 ? 与所有 C# 原语一起使用,字符串除外。

          以下页面列出了 C# 原语http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx

          【讨论】:

          • 链接已损坏,谢谢
          • 谢谢 Mina,我找到了不同的链接并更新了参考。
          • 不仅仅是原语,所有不可为空的值类型(.NET 没有专门处理的)都可以工作。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-26
          • 2014-10-23
          • 2012-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多