Princípio da Completude de tipo em C#

C# utiliza valores de segunda classe(valores que são usados com restrições)? Se utilizar ele viola o princípio da completude de tipo que diz que [quote]Nenhuma construção de linguagem deve ser arbitrariamente restringida pelo tipo dos valores envolvidos na mesma[/quote]
E ai? oq vcs acham?

cara, aqui é um forum de Java, vai no site da msdn que talvez eles te ajudam!

boa sorte!

Já tentei la velho… não acho nada relacionado… eu sei q eh forum java… mas eu postei a duvida no fórum de outras linguagens

Ele está se referindo a isto aqui:
http://www.cs.jcu.edu.au/Subjects/cp2003/1997/foils/moreTypes/moreTypes.html

Se for isso, tanto C# quanto Java não têm valores de segunda classe, porque structs, classes e tipos primitivos podem ser passados de/para métodos, etc.

Como a tal página é velha (1997), então ela não considerou a evolução das linguagens. O exemplo dado (Pascal não poder retornar em um método um “record”) não vale mais.

hahahaha engracado que se alguem pergunta alguma coisa sobre C ia ter 20 nego respondendo.
Como eh C# sempre aparece alguem “reclamando” que aqui eh forum de Java :smiley:

[quote=mcbarsotti]cara, aqui é um forum de Java, vai no site da msdn que talvez eles te ajudam!

boa sorte![/quote]

Não senhor, esse aqui é o forum “Outras linguagens”, que fica na seção de mesmo nome que abriga também o forum de Ruby. E mesmo antes de existir essa seção específica o GUJ sempre foi aberto à praticamente qualquer assunto referente ao desenvolvimento de software.

E ai? oq vcs acham?[/quote]

Tipos escalares suportam as mesmas operações que tipos por referência. Poderia citar exemplos de quais operações são restritas? Conheço a CLR razoavelmente bem e não tenho um exemplo disso. Não é o caso dos tipos primitivos do Java, por exemplo.

Bem galera… vlw pela ajuda ai!

Pesquisando um pouquinho e lendo um livro aqui sobre Paradigmas de Linguagens de Programação cheguei a seguinte conclusao

Em C# temos valores de segunda classe como por exemplo no código abaixo, uma abstração de procedimento.

public void oiMundo() { Console.write("oiMundo"); }

Onde viola o princípio da completude de tipo pois uma abstração de procedimento não pode ser um argumento para um abstração de função.

Eu desconehcia esse principio:
Lendo mais cheguei nesse afirmação:

Se nenhuma operação nao deve ser restringida pelo tipo de valores envolvidos em Java a sobrecarga d metodos não violaria esse principio?
Tipo:

System.out.println(double value) , System.out.println(boolean value) , System.out.println(int value)

Ou entendi errado?.. :roll:

Acho que falei a besteira qnto a sobrecarga.
A sobrecarga de metodos é um caracteristica da Orietancao a Objetos.

Mas mudando o tipo da pergunta linguagens orientada a objetos que suportam a sobrecarga não violaria esse principio?

Eu entendi nenhuma construção da linguagem.

Por exemplo, o switch do Java é restrito a tipos primitivos e enums. Obedecer esse princípio significaria que Strings, BigDecimals e qqr outro objeto que implemente comparações poderia ser usado no switch.

É a minha opinião.

Em C# é possível, mas com um pouco de trabalho, receber e retornar referências a métodos também.
Este código foi testado com o Visual Studio 2008.

    // Requer .NET Framework 3.5 (Visual Studio 2008) para rodar
    class Exemplo
    {
        // Teste para procedimentos
        public void oiMundo()
        {
            Console.WriteLine("Oi, mundo!");
        }
        public void adeusMundoCruel() 
        {
            Console.WriteLine("Adeus, mundo cruel!");
        }
        public Action retornaAcao(int n)
        {
            switch (n)
            {
                case 1: return oiMundo;
                case 2: return adeusMundoCruel;
                default: return null;
            }
        }
        public void executaAcao(Action act)
        {
            act();
        }

        // Teste para funções
        public int max(int x, int y)
        {
            return x > y ? x : y;
        }
        Func<int, int, int> min = (x, y) => x < y ? x : y;
        public int executaFuncao(Func<int, int, int> f, int x, int y)
        {
            return f(x, y);
        }


        public Exemplo()
        {
            retornaAcao(1)();
            executaAcao(retornaAcao(2));

            Console.WriteLine("Maximo de 10 e 20 eh " + executaFuncao(max, 10, 20));
            Console.WriteLine("Minimo de 10 e 20 eh " + executaFuncao(min, 10, 20));
        }
    }

[quote]Em C# é possível, mas com um pouco de trabalho, receber e retornar referências a métodos também.
Este código foi testado com o Visual Studio 2008. [/quote]

Qual o problema disso? Se tem algum

Só falei “um pouco de trabalho” porque não é intuitivo.

O tipo de uma variável ou parâmetro que recebe uma referência a um método sem parâmetros e que não retorna nada é Action.
O tipo de uma variável ou parâmetro que recebe uma referência a um um método com parâmetros (int, short) e que não retorna nada é Action<int,short>
O tipo de uma variável ou parâmetro que recebe uma referência a um um método sem parâmetros e que retorna um double é Func<double>
O tipo de uma variável ou parâmetro que recebe uma referência a um um método com parâmetros (string, long, decimal) e que retorna um DateTime é Func<string,long,decimal,DateTime>

Veja o programa de exemplo que preparei acima.

A saída esperada dele, se você instanciar um elemento da classe Exemplo, é

Oi, mundo!
Adeus, mundo cruel!
Maximo de 10 e 20 eh 20
Minimo de 10 e 20 eh 10

[quote=raffccc]Bem galera… vlw pela ajuda ai!

Pesquisando um pouquinho e lendo um livro aqui sobre Paradigmas de Linguagens de Programação cheguei a seguinte conclusao

Em C# temos valores de segunda classe como por exemplo no código abaixo, uma abstração de procedimento.

public void oiMundo() { Console.write("oiMundo"); }

Onde viola o princípio da completude de tipo pois uma abstração de procedimento não pode ser um argumento para um abstração de função.

[/quote]

Em C# 3.0 é possível converter qualquer expressão em dados:

	static void If (Func<bool> cond, Action then, Action else_) {
		if (cond())
			then();
		else 
			else_();			
	}


	static void Main () {
		If (()=> true , ()=> Console.WriteLine ("Oi Mundo"), ()=> Console.WriteLine ("Nada no else") );
	}

C# 3.0 tem closures, ainda não existe conversão automática de código em closures, mas isso é outra história.

[quote=pcalcado][quote=mcbarsotti]cara, aqui é um forum de Java, vai no site da msdn que talvez eles te ajudam!

boa sorte![/quote]

Não senhor, esse aqui é o forum “Outras linguagens”, que fica na seção de mesmo nome que abriga também o forum de Ruby. E mesmo antes de existir essa seção específica o GUJ sempre foi aberto à praticamente qualquer assunto referente ao desenvolvimento de software.[/quote]

opaa, é a força do habito!! :lol:
mas se a idéia é abragir qualquer assunto relacionado ao desenvolvimento, não deveriam trocar o slogan do guj “e o maior forum brasileiro sobre Java” por “e o maior forum brasileiro sobre Desenvolvimento e Java” ou algo do tipo :roll:

abraços!

Continuamos sendo o maior forum sobre Java. O slogan nao diz que o forum eh somente sobre Java :wink: