#c_sharp #net #c_sharp_80
По мотивам этого вопроса Есть старый код, который перевожу на c#8 и там есть методы void MethodName(T value) => ... и много вызовов вида MethodName(null); который может принимать как классы, так и структуры, а значит мы не можем сделать так void MethodName (T? value) => ... потому что потребует указания типа T, а мы не можем указать where T: class, struct Приходится давить варнинг при вызове #nullable disable MethodName(null) #nullable enable Но оказалось что работает и так MethodName(null!) Это вообще нормально? Это недоработка компилятора (бета все-таки)? Или же ! означает не просто "уверен тут не null", а более широкое "с этим значение все хорошо, проходи мимо"?
Ответы
Ответ 1
Согласно одному из примеров в документации, постфиксный оператор ! может использоваться, чтобы показать вашу осведомленность об использовании нулевой ссылки (в том числе и представленной непосредственно литералом null). ! (null-forgiving) operator (C# reference) One of the use cases of the null-forgiving operator is in testing the argument validation logic. For example, consider the following class: #nullable enable public class Person { public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name)); public string Name { get; } } Using the MSTest test framework, you can create the following test for the validation logic in the constructor: [TestMethod, ExpectedException(typeof(ArgumentNullException))] public void NullNameShouldThrowTest() { var person = new Person(null!); } Without the null-forgiving operator, the compiler generates the following warning for the preceding code: Warning CS8625: Cannot convert null literal to non-nullable reference type. With the use of the null-forgiving operator, you let the compiler know that passing null is expected and shouldn't be warned about. Перевод последнего абзаца: При отсутствии оператора, допускающего значение null, компилятор сгенерирует следующее предупреждение: Warning CS8625: Cannot convert null literal to non-nullable reference type. С помощью использования этого оператора Вы даёте компилятору знать о том, что передача литерала null осознана и не должна вызывать беспокойства. Так что это не недоработка компилятора, а всего лишь один из вариантов использования. Например, для проверки поведения метода в юнит-тестировании.
Комментариев нет:
Отправить комментарий