Erro de cadeia anulável em C #

136
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

Posteriormente no código, eu o uso assim:

typeOfContract = Request.QueryString["type"];

Estou recebendo o seguinte erro na declaração da typeOfContractlinha informando:

O tipo 'string' deve ser um tipo de valor não anulável para usá-lo como parâmetro 'T' no tipo ou método genérico 'System.Nullable <T>'

Alguma ideia? Basicamente, quero garantir que "type"exista QueryStringantes de executar uma ação.

Mike Fielden
fonte

Respostas:

304

System.String é um tipo de referência e já "anulável".

Anulável <T> e o? o sufixo é para tipos de valor como Int32, Double, DateTime etc.

Joe
fonte
13
Uma coisa a observar: Nullable <T> é o próprio tipo de valor, mas a restrição de tipo genérico "struct" inclui apenas tipos de valores não anuláveis ​​- portanto, você não pode fazer Nullable <Nullable <int>>.
Jon Skeet
No C # 8.0, os tipos de referência podem ser marcados como anuláveis. Pode-se digitar string?para dizer ao mundo que essa string pode ser nula.
Re
39

Você está tornando isso complicado. stringjá é anulável. Você não precisa torná-lo mais anulável. Retire ?o tipo de propriedade.

piada
fonte
19

string não pode ser o parâmetro Nullable porque string não é um tipo de valor. String é um tipo de referência.

string s = null; 

é uma declaração muito válida e não é necessário torná-la anulável.

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

deve trabalhar por causa da como palavra-chave.

Szymon Rozga
fonte
13

String é um tipo de referência, portanto você não precisa (e não pode) usar Nullable<T>aqui. Apenas declare typeOfContract como string e simplesmente verifique se há nulo depois de obtê-lo da string de consulta. Ou use String.IsNullOrEmpty se desejar manipular valores de string vazios da mesma forma que null.

csgero
fonte
4

Para anulável, use ?com todas as primitivas de C # , exceto a sequência.

A página a seguir fornece uma lista dos primitivos em C # : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx

James Oravec
fonte
1
O link está quebrado Obrigado #
Mina Gabriel
Obrigado Mina, encontrei um link diferente e atualizei a referência.
James Oravec
1
Não apenas primitivos, todos os tipos de valores não anuláveis ​​(que não são tratados especialmente pelo .NET) funcionam.
IllidanS4 quer Monica de volta 04/04/11
0

Observe que na próxima versão do C #, que é 8, as respostas não são verdadeiras.

All the reference types are non-nullable by default e você pode realmente fazer o seguinte:

public string? MyNullableString; 
this.MyNullableString = null; //Valid

Contudo,

public string MyNonNullableString; 
this.MyNonNullableString = null; //Not Valid and you'll receive compiler warning. 

O importante aqui é mostrar a intenção do seu código. Se a "intenção" é que o tipo de referência possa ser nulo, marque-o, caso contrário, a atribuição de valor nulo a não nulo resultaria em aviso do compilador.

Mais informações

Para o moderador que está excluindo todas as respostas, não faça isso. Acredito firmemente que esta resposta agrega valor e a exclusão impediria alguém de saber o que é certo no momento. Como você excluiu todas as respostas, estou postando novamente a resposta aqui. O link que foi enviado sobre "duplicatas" é simplesmente uma abertura para algumas pessoas e eu não acho que seja uma recomendação oficial.

ANewGuyInTown
fonte