C # помилка нульового рядка


136
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

Пізніше в коді я його використовую так:

typeOfContract = Request.QueryString["type"];

При оголошенні typeOfContractрядка я отримую таку помилку :

Тип 'string' повинен бути типом значення, яке не зводиться до нуля, щоб використовувати його як параметр 'T' у загальному типі або методі 'System.Nullable <T>'

Будь-які ідеї? В основному я хочу переконатися, що "type"існує в QueryStringпопередньому виконанні дії.

Відповіді:


304

System.String - це еталонний тип і вже є "нульовим".

Nullable <T> і? суфікс призначений для типів значень, таких як Int32, Double, DateTime тощо.


13
Варто зазначити одне: Nullable <T> є самим типом значення, але загальне обмеження типу "struct" включає лише типи значень, що не змінюються, тому ви не можете робити Nullable <Nullable <int>>.
Джон Скіт

У C # 8.0 типи посилань можуть бути позначені як нульові. Можна набрати, string?щоб повідомити світові, що ця рядок може бути нульовою. Ref: youtube.com/watch?v=VdC0aoa7ung
nkalfov

39

Ви це ускладнюєте. stringвже зведена нанівець. Не потрібно робити це більш зворотним. Виберіть ?тип власності.


19

рядок не може бути параметром Nullable, оскільки рядок не є типом значення. Рядок - це еталонний тип.

string s = null; 

це дуже коректне твердження, і немає необхідності робити його нульовим.

private string typeOfContract
    {
      get { return ViewState["typeOfContract"] as string; }
      set { ViewState["typeOfContract"] = value; }
    }

повинен працювати через ключове слово as .


13

Рядок є еталонним типом, тому тут не потрібно (і не може) використовувати Nullable<T>. Просто задекларуйте typeOfContract як рядок і просто перевірте наявність null після отримання його з рядка запиту. Або використовуйте String.IsNullOrEmpty, якщо ви хочете обробити порожні рядкові значення, такі самі, як null.


4

Для мінливого використання використовуйте ?всі C-примітиви , крім рядка.

На наступній сторінці подано список примітивів C # : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx


1
Посилання перервана подяка
Міна Габріель

Дякую Міна, я знайшов інше посилання та оновив посилання.
Джеймс Оравець

1
Працюють не лише примітиви, усі типи значень, що не змінюються (які не обробляються спеціально .NET).
IllidanS4 хоче, щоб Моніка повернулася

0

Зауважте, що у наступній версії C #, що становить 8, відповіді не відповідають дійсності.

All the reference types are non-nullable by default і ви можете зробити наступне:

public string? MyNullableString; 
this.MyNullableString = null; //Valid

Однак,

public string MyNonNullableString; 
this.MyNonNullableString = null; //Not Valid and you'll receive compiler warning. 

Тут важливим є показ наміру вашого коду. Якщо "намір" полягає в тому, що тип посилання може бути нульовим, то позначте його, щоб інакше присвоєння нульового значення ненульовому значенню призвело б до попередження компілятора.

Більше інформації

Модератору, який видаляє всі відповіді, не робіть цього. Я переконаний, що ця відповідь додає цінності, а її видалення просто не дозволить комусь знати, що саме в той момент. Оскільки ви видалили всі відповіді, тут я повторно публікую відповідь. Посилання, яке було надіслано щодо "дублікатів", є просто відкриттям для деяких людей, і я не думаю, що це офіційна рекомендація.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.