contratos de código .NET: ele pode ficar mais básico do que isso?
-
12-09-2019 - |
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:)
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)