Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Tipo Nullable
  2. Tipo dinâmico: var
  3. Tipo dinâmico: dynamic
  4. ex. var com mais tipos
  5. ex. dynamic com mais tipos

A linguagem C# permite que os tipos de dados primitivos possam também conter valor nulo. Por exemplo, uma variável do tipo bool pode ter três valores: null, true ou false. Para isso, utilizamos o operador (?) para declarar uma variável como nullable.

Quando declaramos um variável posfixada com o operador (?) tornamos essa variável como nullable, ou seja, um variável que aceita valor atribuição de valor null.

Sintaxe
tipo_dado? nome_variavel; //null
tipo_dado? nome_variavel = valor;
Exemplo 1
using System;
public class Program
{
	public static void Main()
	{
		bool? flag = null;
		Console.WriteLine(flag);
		flag = true;
		Console.WriteLine(flag);
		flag = false;
		Console.WriteLine(flag);
	}
}
Saída
True
False

Para manipular o valor de variável nullable mencionadas acima, utiilizamos as propriedades HasValue e Value. A primeira verifica se um variável ou objeto possui valor e a segunda recuperar da variável.

Sintaxe
nome_variavel.HasValue;

nome_variavel.Value
Exemplo 2
using System;
public class Program
{
	public static void Main()
	{
		bool? variavel = null;
		Console.WriteLine(variavel.HasValue);
		variavel = true;
		Console.WriteLine(variavel.Value);
	}
}
Saída
False
True

O aperador (?) também pode ser utilizado com conjunto com outros tipos de dados mais complexos como Objetos, não ficando restrito aos tipos primitivos bem como aplicado em atributos de classes e parâmetros de métodos.

Outros operadores relacionados à nulidade podem ser vistos em Operadores: Outros operadores.

C#, apesar de fortemente tipada, possui um recurso que a torna mais flexível em relação a tipagem. Nesta parte do tutorial vamos entender o uso de var e dynamic.

Com o uso da palavra reservada var, podemos atribuir valores à uma variável sem saber o tipo de dado do valor atribuído. A verificação e atribuição do tipo de dado é feita em tempo de compilação por inferência.

Sintaxe
var nome_variavel = valor;
Exemplo 3
using System;
public class Program
{
	public static void Main()
	{
		var valor = 100;
        var str = "string";
        var val = 'Z';
	}
}

Uma vez atribuído um valor a uma variável declarada como var, uma atribuição posterior, que não seja o mesmo tipo do primeiro valor atribuído, é proibida, gerando erro de conversão de dados na compilação.

Exemplo 4
using System;
public class Program
{
	public static void Main()
	{
		var valor = 1;
		valor = true; //Erro de conversão será gerado.
	}
}
Saída
Compilation error (line 7, col 11): Cannot implicitly convert type 'bool' to 'int'

Com o uso da palavra reservada dynamic podemos atribuir valores a uma variável sem mesmo saber o tipo de dado do valor atribuído. A verificação e atribuição do tipo de dado da variável declarada com var é em tempo de execução.

Sintaxe
dynamic nome_variavel = valor;
Exemplo 5
using System;
public class Program
{
	public static void Main()
	{
		dynamic valor = 1; //tipo int
        Console.WriteLine(valor);
	}
}
Saída
1

A diferença básica entre var e dynamic é que a segunda resolve o tipo de dado em tempo de execução o que nos permite atribuir diferentes tipos de dados para uma mesma variável dynamic, situação que não é possível utilizando var.

Exemplo 6
using System;
public class Program
{
	public static void Main()
	{
		dynamic valor = 1; //tipo int
        Console.WriteLine(valor);
		valor = true; //agora tipo bool
        Console.WriteLine(valor);
	}
}
Saída
1
True

O uso de dynamic pode ser utilizada tanto com tipos primitivos quanto objetos nativos .NET ou classes e structs criados pelo usuário.

A checagem de tipo de dados de uma variável dynamic pode ser feita utilizando o operador (is) que foi visto em C#: Variáveis.

Para mais informações sobre o tipo dynamic e mais usos desse tipo pode ser conferido em sua seção específica C#: Dynamic.

  1. 05/08/2025 - revisão 2 - Correções: pontuais, sintaxes, links 'Objetivos', links internos e separação 'var'/'dynamic'
  2. 15/10/2024 - revisão 1 - Correção: Exemplos, link 'Anterior'; Ajustes pontuais
  3. 05/03/2024 - versão inicial