Kaip galiu grąžinti NULL iš bendro metodo C #?

Turiu bendrą metodą su šiuo (fiktyviu) kodu.

 static T FindThing<T>(IList collection, int id) where T : IThing, new() { foreach T thing in collecion { if (thing.Id == id) return thing; } return null; // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead. } 

Tai suteikia man statybą

"Nulinio parametro neįmanoma konvertuoti į" T ", nes jis gali būti vertės tipas. Vietoj to naudokite" default "(T).

Ar galima išvengti šios klaidos?

465
19 нояб. nustatė Edosoft 19 nov. 2008-11-19 17:51 '08 at 17:51 pm 2008-11-19 17:51
@ 11 atsakymų

Du variantai:

  • Grąžina default(T) o tai reiškia, kad grįšite null jei T yra atskaitos tipas (arba null vertės tipas), 0int , '\0' char ir tt ( Numatytoji reikšmių lentelė (C # nuoroda) )
  • Apribokite T atskaitos tipą, kuriame yra where T: class ir tada grąžinkite null kaip įprasta
814
19 нояб. Atsakymą pateikė Jon Skeet lapkričio 19 d 2008-11-19 17:59 '08 at 17:59 pm 2008-11-19 17:59
 return default(T); 
69
19 нояб. Ricardo Villamil lapkričio 19 d. Atsakymas 2008-11-19 17:56 '08, 17:56, 2008-11-19 17:56

Galite tiesiog nustatyti savo apribojimus:

 where T : class 

Tada leidžiama grąžinti nulį.

24
19 нояб. Atsakymą pateikė TheSoftwareJedi 19 lapkritis 2008-11-19 18:01 '08 at 18:01 2008-11-19 18:01

Pridėkite klasės suvaržymą kaip pirmąjį bendrinio tipo apribojimą.

 static T FindThing<T>(IList collection, int id) where T : class, IThing, new() 
10
19 нояб. atsakymas pateikiamas Min 19 lapkričio. 2008-11-19 18:02 '08 at 18:02 2008-11-19 18:02
  • Jei turite objektą, jums reikia tipo

     return (T)(object)(employee); 
  • jei reikia grąžinti nulį.

     return default(T); 
6
06 авг. atsakymas pateiktas vartotojo725388 rugpjūčio 06 d 2012-08-06 14:15 '12 14:15 pm 2012-08-06 14:15

Kita galimybė - pridėti šį skelbimo pabaigą:

  where T : class where T: IList 

Tokiu būdu galite grąžinti nulį.

5
19 нояб. Atsakymas pateikiamas BFree 19 lapkričio. 2008-11-19 18:01 '08 at 18:01 2008-11-19 18:01

Žemiau yra dvi parinktys, kurias galite naudoti.

 return default(T); 

arba

 where T : class, IThing return null; 
3
24 сент. Atsakymas, kurį pateikė Jaydeep Shil Sep 24 2015-09-24 09:30 '15 , 9:30 val. 2015-09-24 09:30

Programinė įrangaJedi sprendimas veikia,

Taip pat galite archyvuoti ją naudodami verčių porą ir tipus su nulio reikšme:

 static T? FindThing<T>(IList collection, int id) where T : struct, IThing { foreach T thing in collecion { if (thing.Id == id) return thing; } return null; } 
2
02 дек. atsakymas duodamas 02 d. 2011-12-02 13:11 '11, 13:11 2011-12-02 13:11

Paimkite klaidos rekomendaciją ... ir vartotojo default(T) arba new T

Turėsite pridėti palyginimą su kodu, kad įsitikintumėte, jog tai yra tinkama atitiktis, jei sekate šį maršrutą.

Priešingu atveju, galbūt apsvarstykite išvesties parametrą „atitikčiai rasti“.

1
19 нояб. Atsakymą pateikia „ Mitchel Sellers“ lapkričio 19 d 2008-11-19 17:56 '08, 17:56, 2008-11-19 17:56

Čia pateikiamas „Nullable Enum“ grąžinimo verčių pavyzdys:

 public static TEnum? ParseOptional<TEnum>(this string value) where TEnum : struct { return value == null ? (TEnum?)null : (TEnum) Enum.Parse(typeof(TEnum), value); } 
1
12 марта '15 в 4:24 2015-03-12 04:24 atsakymą Luke davė kovo 15 d. 15 val. 4:24 2015-03-12 04:24

Kita alternatyva dviem pirmiau pateiktiems atsakymams. Jei pakeisite objekto grąžinimo tipą, galite grąžinti null ir tuo pačiu metu grąžinti ne nulines pajamas.

 static object FindThing<T>(IList collection, int id) { foreach T thing in collecion { if (thing.Id == id) return (T) thing; } return null; // allowed now } 
0
14 июля '18 в 15:52 2018-07-14 15:52 Atsakymą davė Jeson Martajaya liepos 18 d., 18 val. 15:52 2018-07-14 15:52

Žr. Kitus klausimus apie žymes arba užduoti klausimą