'String' türünün, 'System.Nullable <T>' genel türünde veya yönteminde T parametresi olarak kullanabilmesi için nullable olmayan bir tür olması gerekir.


172

Neden "" dize "türünün, genel tür veya yöntem" System.Nullable '"parametresinde' T 'parametresi olarak kullanılabilmesi için null değeri olmayan bir değer türü olması gerekir?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Universe;

namespace Universe
{
    public class clsdictionary
    {
      private string? m_Word = "";
      private string? m_Meaning = "";

      string? Word { 
          get { return m_Word; }
          set { m_Word = value; }
      }

      string? Meaning { 
          get { return m_Meaning; }
          set { m_Meaning = value; }
      }
    }
}

21
Stringzaten geçersiz.
M.Babcock

Yanıtlar:


204

Kodunuzdaki tüm yerler stringyerine kullanın string?.

Nullable<T>T tipi, örneğin, bir NULL olmayan bir değer türüdür gerektirir intya da DateTime. Gibi referans türleri stringzaten boş olabilir. Nullable<string>İzin verilmemesi gibi şeylere izin vermenin bir anlamı olmayacaktır .

Ayrıca C # 3.0 veya üstünü kullanıyorsanız, otomatik olarak uygulanan özellikleri kullanarak kodunuzu basitleştirebilirsiniz :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}

1
M.Babcock, ne zaman m_Word = null, hataları, herhangi bir öneri yapmak? Word'ü boş olarak ayarlayabilmek istiyorum.
MiscellaneousUser

1
@MiscellaneousUser: Hangi hata mesajını alıyorsunuz? Derlemeye çalıştığınız dosyayı tam olarak gönderebilir misiniz? Kodunuzun yalnızca bir satırını görmekle ilgili hatanızın ne olduğunu tahmin etmek zor. Yani bir noktalı virgül eksik olabilir ... ama belki sadece kopyala + yapıştırmayı unuttun ... Derlemeye çalıştığın kodu gönderene kadar tahmin etmeden başka bir şey değil.
Mark Byers

Yardımınız için teşekkürler, bu gönderi stackoverflow.com/questions/187406/… 'a bakın ve soru işaretinin yalnızca değer türleri için olduğunu görebilirsiniz.
MiscellaneousUser

@MiscellaneousUser: Sadece "değer türleri için" değil. Özellikle null değeri olmayan bir değer türü olmalıdır. Hata mesajının söylediği gibi.
Mark Byers

1
Heh, Swift'i bir süre programladıktan sonra, bu bir C # projesinde en iyisi oldu.
Albert Bori

52

stringbir başvuru türü, bir sınıftır. Yalnızca kullanabilir Nullable<T>veya T?olmayan null ile C # sözdizimsel şeker değeri gibi türleri intve Guid.

Özellikle, stringbir referans türü olduğu gibi , bir tür ifadesi stringzaten boş olabilir:

string lookMaNoText = null;

15

System.String (büyük harf S ile) zaten geçersizdir, böyle ilan etmenize gerek yoktur.

(string? myStr) Hata.


Cevabınız için küçük düzenleme, büyük harf önemini vurgulamak. C # için yeniyim ve bu küçük farkı elde etmek beni sonsuza dek aldı.
B - rian

4

Çok özel bir nedenden ötürü Nullable<int>imlecinizi Nullable üzerine getirin ve F12 tuşuna basın - Meta veriler nedeni sağlar (Yapı kısıtlamasına dikkat edin):

public struct Nullable<T> where T : struct
{
...
}

http://msdn.microsoft.com/en-us/library/d5x73970.aspx


4
O olsa Not Nullable<Nullable<int>>olsa izin verilmese Nullable<int>olan bir yapıdır.
Mark Byers

İlginç. Bu derleyiciye "kodlanmış" mı? Belirli bir yapı ile nasıl sınırlandırılır (Nullable <Nullable <... >>)? - Düzenle Görünüşe göre şimdi özel - Derleme Hatası ... boş değer olmayan bir değer türü olmalıdır ....
Joshua Enfield

4

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

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.