Pergunta

Eu estava apenas brincando a pergunta de resposta de alguém aqui no estouro de pilha, quando notei um aviso de verificação estática de dentro do meu Visual Studio (2008):

string[] source = { "1", "A", "B" };
var sourceObjects = Array.ConvertAll(source, c => new Source(c)).ToArray();

Estou recebendo a mensagem requer fonte não comprovada! = Null . Parece bastante óbvio para mim que este não é o caso. Este é apenas um exemplo claro. Por outro lado, algumas coisas muito bacana parece estar funcionando muito bem.

Eu estou usando o 1.2.20518.12 lançamento (18 de maio). Acho contratos de código muito interessante, mas tem mais alguém teve casos como este? Você considera o utilizável atual implementação, na prática, ou você iria considerá-los puramente acadêmico neste momento?

Eu fiz isso uma comunidade wiki, mas eu gostaria de ouvir algumas opiniões:)

Foi útil?

Solução

Faz mais sentido se você dividir as duas chamadas se:

string[] source = { "1", "A", "B" };
var tmp = Array.ConvertAll(source, c => new Source(c));
var sourceObjects = tmp.ToArray();

Agora, ele aponta para o última linha que o problema. Em outras palavras, a chamada para Array.ConvertAll conhece essa fonte não é nulo, mas a chamada para ToArray() não sabe que tmp não será nulo.

(Seu exemplo é também um pouco confuso devido ao uso do nome source em seu código-fonte - o erro ainda usaria source mesmo se você tinha chamado o seu algo variável completamente diferente, como ele está se referindo ao primeiro parâmetro na Enumerable.ToArray .)

Basicamente, eu acredito que isso faria todo o trabalho quando Array.ConvertAll recebe uma pós-condição não-nulidade apropriado. Até então, isso vai fazer o truque:

string[] source = { "1", "A", "B" };
var tmp = Array.ConvertAll(source, c => new Source(c));
Contract.Assume(tmp != null);
var sourceObjects = tmp.ToArray();

Eu concordo esse tipo de coisa é chato, mas eu tenho certeza que vai melhorar rapidamente como MS acrescenta mais e mais contratos na BCL. É importante notar que a sua não um problema com o verificador estático em si.

(Na verdade, Array.ConvertAll não tem uma condição prévia ou -. Se você definir a variável source como nulo no segundo código trecho acima, seria ainda não reclamar)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top