Что означает восклицательный знак перед точкой C#
public static Matrix SetMatrix(string path)
{
using (StreamReader sr = new StreamReader(path))
{
string? line = sr.ReadLine();
var size = line!.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
Matrix a = new Matrix(Int32.Parse(size[0]), Int32.Parse(size[1]));
for (int i = 0; i < a.Row; i++)
{
line = sr.ReadLine();
var values = line!.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
for (int j = 0; j < a.Column; j++)
{
a[i, j] = Double.Parse(values[j]);
}
}
return a;
}
}
Такой вопрос, вот в этом месте var size = line!.Split если убрать восклицательный знак, то будет предупреждение, что возможно разыменовывается переменная со значением null. Нашел решение поставить восклицательный знак, а что он обозначает так и не нашел. Кто может объяснить
public static void SetMatrix(Matrix a)
{
for (int i = 0; i < a.Row; i++)
{
for (int j = 0; j < a.Column; j++)
{
Console.WriteLine($"Введите [{i},{j}] элемент матрицы: ");
a[i, j] = Double.Parse(Console.ReadLine());
}
}
}
И вот в этом методе в строке a[i, j] = Double.Parse(Console.ReadLine()); такое же предупреждение, но его не знаю как решить. Помогите пожалуйста.
Ответы (2 шт):
Это null-forgiving operator: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-forgiving Появился, если мне не изменяет память, в C# 8.0
string? - это нулейбл вариант стринга. То есть стринг, который может иметь значение null
эта возможность потянула за собой появление новых операторов как ?. и !.
?. - обращаемся к нулейбл переменной учитывая что переменная может быть null. Если налл - то не вызываем метод или не обращаемся к проперте после точки, а возвращаем так же налл вместо этого.
!. - мы гарантируем системе что в этой переменной не может быть null, после чего мы обращаемся к проперте или методу.