Sdílet prostřednictvím


Chyby a upozornění přidružená k typům ref struct

  • CS8343: ref structs Nelze implementovat rozhraní
  • CS8344: foreach Příkaz nemůže pracovat s enumerátory v asynchronních nebo iterátorových metodách, protože typ je ref struct nebo parametr typu, který umožňuje ref struct.
  • CS8345: Pole nebo automaticky implementovaná vlastnost nemůže být typu, pokud není členem ref structinstance .
  • CS9048: scoped Modifikátor lze použít pouze pro odkazy a ref struct hodnoty.
  • CS9050: Pole ref nemůže odkazovat na .ref struct
  • CS9059: Pole ref lze deklarovat pouze ve struktuře odkazu.
  • CS9241: "ref struktura" je již zadána.
  • CS9242: Klauzule constraint "allows" musí být posledním zadaným omezením.
  • CS9243: Nelze povolit ref struktury pro parametr typu známé z jiných omezení být třída.
  • CS9244: Typ nemusí být ref struct parametr typu, který umožňuje struktury ref použít jako parametr v obecném typu nebo metodě.
  • CS9245: Typ nemůže implementovat člen rozhraní pro ref struct typ.
  • CS9246: Člen rozhraní jiné instance než virtuální instance nelze získat přístup k parametru typu, který umožňuje strukturu ref.
  • CS9247: příkaz foreach nemůže pracovat s enumerátory typu, protože jde o parametr typu, který umožňuje refstrukci a není známo v době kompilace implementovat IDisposable.
  • CS9267: Typ prvku iterátoru nemusí být struktura ref nebo parametr typu umožňující struktury ref

porušení bezpečnosti ref

  • CS8345: Pole nebo automaticky implementovaná vlastnost nemůže být typu, pokud není členem ref structinstance .
  • CS9048: scoped Modifikátor lze použít pouze pro odkazy a ref struct hodnoty.
  • CS9050: Pole ref nemůže odkazovat na .ref struct
  • CS9059: Pole ref lze deklarovat pouze v ref structpoli .

Typ ref struct může obsahovat ref pole. Jiné typy nejsou povolená ref pole. Kompilátor vynucuje omezení deklarací a použití ref struct typů k vynucení pravidel bezpečnosti ref u instancí libovolného ref struct typu:

  • Pouze ref struct typy mohou obsahovat automaticky implementované ref vlastnosti.
  • Modifikátor mohou mít scoped pouze ref struct typy nebo ref proměnné.
  • Pole ref lze deklarovat pouze v ref struct typu.
  • Pole ref nemůže odkazovat na ref struct typ nebo

Porušení některé z těchto pravidel způsobí jednu z uvedených chyb. Pokud jste chtěli použít tuto jazykovou funkci, převeďte typ na .ref struct Jinak odeberte nepovolenou konstruktoru.

ref – implementace rozhraní

  • CS8343: ref structs Nelze implementovat rozhraní
  • CS8344: foreach Příkaz nemůže pracovat s enumerátory v asynchronních nebo iterátorových metodách, protože typ je ref struct nebo parametr typu, který umožňuje ref struct.
  • CS9241: "ref struktura" je již zadána.
  • CS9242: Klauzule constraint "allows" musí být posledním zadaným omezením.
  • CS9243: Nelze povolit ref struktury pro parametr typu známé z jiných omezení být třída.
  • CS9244: Typ nemusí být ref struct parametr typu, který umožňuje struktury ref použít jako parametr v obecném typu nebo metodě.
  • CS9245: Typ nemůže implementovat člen rozhraní pro ref struct typ.
  • CS9246: Člen rozhraní jiné instance než virtuální instance nelze získat přístup k parametru typu, který umožňuje strukturu ref.
  • CS9247: příkaz foreach nemůže pracovat s enumerátory typu, protože jde o parametr typu, který umožňuje refstrukci a není známo v době kompilace implementovat IDisposable.
  • CS9267: Typ prvku iterátoru nemusí být struktura ref nebo parametr typu umožňující struktury ref

Před C# 13 ref struct nemůžou typy implementovat rozhraní. Kompilátor vygeneruje CS8343. Počínaje jazykem C# 13 ref struct můžou typy implementovat rozhraní podle následujících pravidel:

  • A ref struct nelze převést na instanci rozhraní, které implementuje. Toto omezení zahrnuje implicitní převod při použití ref struct typu jako argumentu, pokud je parametr typem rozhraní. Výsledkem převodu je krabicový převod, který porušuje bezpečnost ref.
  • Rozhraní ref struct , které implementuje rozhraní , musí implementovat všechny členy rozhraní. Musí ref struct implementovat členy, kde rozhraní obsahuje výchozí implementaci.

Počínaje jazykem C# 13 ref struct lze použít jako argument typu pro parametr obecného typu, pokud a pouze pokud má allows ref struct parametr obecného typu anti-constraint. Při použití allows ref struct anti-constraint musíte postupovat podle těchto pravidel:

  • A ref struct se používá jako argument typu, parametr typu musí mít allows ref struct anti-constraint.- Anti-constraint allows ref struct musí být poslední v where klauzuli pro tento parametr.
  • Použití instancí, které parametr typu musí dodržovat pravidla bezpečnosti ref.
  • Argument ref struct typu, který může být typemref struct, nelze použít jako typ prvku pro metodu iterátoru.