Não. Vamos considerar o operador por conta própria e o uso fortemente encadeado que você possui para ele.
Por si só, .?Adepende da mesma quantidade de conhecimento da classe que o valor esquerdo é e do tipo retornado pelo método como .A != nullfaz, viz. Ele precisa saber que a Apropriedade existe e retorna um valor que pode ser comparado null.
Só podemos argumentar que isso viola a lei de Demeter se as propriedades digitadas o fizerem. Não somos obrigados a ter Aum tipo concreto (seu valor pode ser de um tipo derivado). O acoplamento aqui é mínimo.
Agora vamos considerar var x = A?.B?.C?.D?.E?.F.
O que significa que Adeve ser de um tipo que possa ser nulo ou que possa ter uma Bpropriedade, que deve ser de um tipo que possa ser nulo ou que tenha uma Cpropriedade, e assim por diante até que o tipo da Epropriedade seja algo que possa ser nulo ou poderia ter uma Fpropriedade.
Em outras palavras, precisamos fazer isso com uma linguagem de tipo estaticamente ou ter aplicado uma restrição nos tipos que podem ser retornados se a digitação estiver frouxa. O C # na maioria dos casos usa digitação estática, portanto não alteramos nada.
Se tivéssemos, o código a seguir também violaria a lei:
ExplicitType x;
var b = A.B;
if (b == null)
x = null;
else
{
var c = b.C;
if (c == null)
x = null;
else
{
var d = c.D;
if (d == null)
x = null;
else
{
var e = d.E;
if (e == null)
x = null;
else
x = e.F;
}
}
}
Qual é exatamente o mesmo . Esse código que está usando o acoplamento de diferentes elementos precisa "conhecer" a cadeia completa do acoplamento, mas está usando um código que não viola a Lei de Deméter para fazê-lo, com cada unidade tendo um acoplamento bem definido com nas próximas.
A?.B?.C?.D?.E?.F?iria violá-lo - LoD não é sobre quantos pontos e se o método de chamada tiver essas informações sobre a estrutura que não está violando seus pontos, essa chamada seria perfeitamente aceitável. Que tal código poderia violar LoD não é suficiente para dizer que todos os usos do que fazer violar LoD.