Обнуляемые ссылочные типы молча терпят неудачу при обращении к забытому коду? - PullRequest
3 голосов
/ 26 апреля 2020

У меня есть C# проект с включаемыми ссылочными типами :

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <!-- more stuff here -->
</Project>

Я установил пару предупреждений, чтобы они стали ошибками в моем .editorconfig:

[*.cs]

# CS8600: Converting null literal or possible null value to non-nullable type.
dotnet_diagnostic.CS8600.severity = error

# CS8603: Possible null reference return.
dotnet_diagnostic.CS8603.severity = error

В моем проекте у меня есть класс, и следующее не скомпилирует , что идеально:

public class NullableCompilerChecking
{
   public string WontCompile(string? input)
    => input;  // error: "possible null reference return"
}

Теперь о проблеме. Мой проект ссылается на другой проект под названием «Библиотека». Библиотека не имеет смысла В библиотеке у меня есть следующее:

  public static class Strings
  {
    public static string Null => null;
  }

Проблема в том, что когда я ссылаюсь на класс Strings из моей библиотеки, я теряю замечательную проверку на нуль. Например, следующие компоненты компилируются и генерируют во время выполнения:

    [Test]
    public void SomeTest()
    {
      var myString = Strings.Null;
      var myIndex = myString.IndexOf("a");
    }

Я хотел бы, чтобы библиотека string по умолчанию приходила к знающему нулевой код как string?, а не string. Могу я это сделать?

1 Ответ

1 голос
/ 26 апреля 2020

Насколько я знаю, если вы хотите новую проверку на нуль в библиотеке, которая ее не поддерживает, вы должны создать вокруг нее обертку , с надлежащим пониманием нуля. Например:

public static class Strings
{
  public static string Null => null;
}

// In your code you will use only the wrapper
public static class StringsWrapper
{
  public static string? Null => Strings.Null;
}

Если вы используете ReSharper, другой ленивый вариант - включить pessimisti c анализ обнуляемости , который выдает предупреждение / ошибку везде, где вы используете значение, которое может быть нулевым.

...