C # boş değerli dize hatası


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

Daha sonra kodda ben böyle kullanın:

typeOfContract = Request.QueryString["type"];

typeOfContractSatır belirten bildirimde aşağıdaki hatayı alıyorum :

'Dize' türünün, 'System.Nullable <T>' genel türünde veya yönteminde 'T' parametresi olarak kullanabilmesi için boş değerli olmayan bir değer türü olması gerekir.

Herhangi bir fikir? Temel olarak, bir eylem gerçekleştirmeden önce "type"var olduğundan emin olmak istiyorum QueryString.

Yanıtlar:


304

System.String bir başvuru türüdür ve "null" olabilir.

Sıfırlanabilir <T> ve? sonek Int32, Double, DateTime vb. değer türleri içindir.


13
Dikkat edilmesi gereken bir nokta: Nullable <T> bir değer türünün kendisidir, ancak "struct" genel tür kısıtlaması yalnızca null edilemeyen değer türlerini içerir - bu nedenle Nullable <Nullable <int>> yapamazsınız.
Jon Skeet

C # 8.0'da referans türleri boş bırakılabilir olarak işaretlenebilir. string?Dünyaya bu dizenin boş olabileceğini söylemek için yazı yazabilirsiniz . Ref: youtube.com/watch?v=VdC0aoa7ung
nkalfov

39

Karmaşık yapıyorsunuz. stringzaten geçersiz. Daha hükümsüz kılmak zorunda değilsiniz . ?Mülk türünü çıkarın .


19

dize bir değer türü olmadığından dize Nullable parametresi olamaz. Dize bir referans türüdür.

string s = null; 

çok geçerli bir ifadedir ve bunu geçersiz kılmaya gerek yoktur.

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

as anahtar kelimesi nedeniyle çalışmalıdır .


13

Dize bir referans türüdür, bu nedenle Nullable<T>burada kullanmanız gerekmez (ve kullanamazsınız) . TypeOfContract öğesini dize olarak bildirmeniz ve sorgu dizesinden aldıktan sonra null olup olmadığını kontrol etmeniz yeterlidir. Veya boş dize değerlerini null ile aynı işlemek istiyorsanız String.IsNullOrEmpty'yi kullanın.


4

Null değeri için, dize hariç ?tüm C # ilkelleriyle kullanın .

Aşağıdaki sayfa C # ilkellerinin bir listesini vermektedir : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx


1
Bağlantı Kesildi Teşekkürler
Mina Gabriel

Teşekkürler Mina, farklı bir bağlantı buldum ve referansı güncelledim.
James Oravec

1
Yalnızca ilkel öğeler değil, null edilemeyen tüm değer türleri (.NET tarafından özel olarak ele alınmayan) çalışır.
IllidanS4 Monica'nın

0

Lütfen C # 'in gelecek 8 sürümünde cevapların doğru olmadığını unutmayın.

All the reference types are non-nullable by default ve aslında aşağıdakileri yapabilirsiniz:

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

Ancak,

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

Burada önemli olan, kodunuzun amacını göstermektir. "Niyet" referans türünün null olabileceğiyse, bunu işaretleyin, aksi takdirde null değerine null değer atamak derleyici uyarısına neden olur.

Daha fazla bilgi

Tüm cevapları silen moderatöre yapmayın. Bu cevabın değer kattığına ve silmenin birisinin o anda neyin doğru olduğunu bilmesini engelleyeceğine inanıyorum. Tüm yanıtları sildiğiniz için yanıtı burada yeniden gönderiyorum. "Kopyalar" ile ilgili olarak gönderilen bağlantı sadece bazı kişilerin açılmasıdır ve bunun resmi bir öneri olduğunu düşünmüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.