Udostępnij za pośrednictwem


Błędy i ostrzeżenia skojarzone z typami ref struct

  • CS8343: ref structs nie można zaimplementować interfejsów
  • CS8344: foreach instrukcja nie może działać na modułach wyliczających w metodach asynchronicznych lub iteratorowych, ponieważ typ jest parametrem ref struct lub typem, który zezwala na ref struct.
  • CS8345: Właściwość pola lub zaimplementowana automatycznie nie może być typu, chyba że jest członkiem wystąpienia ref structklasy .
  • CS9048: scoped Modyfikator może służyć tylko do refs i ref struct wartości.
  • CS9050: ref Pole nie może odwoływać się do elementu ref struct.
  • CS9059: Pole ref można zadeklarować tylko w strukturze ref.
  • CS9241: "refstruct" jest już określony.
  • CS9242: Klauzula ograniczenia "zezwala" musi być ostatnim ograniczeniem określonym.
  • CS9243: Nie można zezwolić na struktury ref dla parametru typu znanego z innych ograniczeń jako klasy.
  • CS9244: Typ może nie być parametrem ref struct lub typem umożliwiającym struktury ref w celu użycia go jako parametru w typie ogólnym lub metodzie.
  • CS9245: Typ nie może zaimplementować elementu członkowskiego interfejsu dla ref struct typu.
  • CS9246: Nie można uzyskać dostępu do elementu członkowskiego interfejsu wystąpienia niewirtualnego w parametrze typu, który umożliwia strukturę ref.
  • CS9247: instrukcja foreach nie może działać na modułach wyliczających typu, ponieważ jest to parametr typu, który umożliwia strukturę refruktury i nie jest znany w czasie kompilacji w celu zaimplementowania IDisposableelementu .
  • CS9267: Typ elementu iteratora może nie być strukturą ref lub parametrem typu umożliwiającym struktury ref

naruszenia bezpieczeństwa ref

  • CS8345: Właściwość pola lub zaimplementowana automatycznie nie może być typu, chyba że jest członkiem wystąpienia ref structklasy .
  • CS9048: scoped Modyfikator może służyć tylko do refs i ref struct wartości.
  • CS9050: ref Pole nie może odwoływać się do elementu ref struct.
  • CS9059: ref Pole można zadeklarować tylko w obiekcie ref struct.

Typ ref struct może zawierać ref pola. Inne typy nie są dozwolonymi ref polami. Kompilator wymusza ograniczenia dotyczące deklaracji i użycia ref struct typów w celu wymuszania reguł bezpieczeństwa ref dla wystąpień dowolnego ref struct typu:

  • Tylko ref struct typy mogą zawierać automatycznie zaimplementowane ref właściwości.
  • Modyfikator może zawierać scoped tylko ref struct typy lub ref zmienne.
  • ref Pole można zadeklarować tylko w typieref struct.
  • Pole ref nie może odwoływać się do ref struct typu/

Naruszenie któregokolwiek z tych zasad powoduje jeden z wymienionych błędów. Jeśli zamierzasz użyć tej funkcji językowej, przekonwertuj ref structtyp na . W przeciwnym razie usuń niedozwoloną konstrukcję.

implementacje interfejsu struktury ref

  • CS8343: ref structs nie można zaimplementować interfejsów
  • CS8344: foreach instrukcja nie może działać na modułach wyliczających w metodach asynchronicznych lub iteratorowych, ponieważ typ jest parametrem ref struct lub typem, który zezwala na ref struct.
  • CS9241: "refstruct" jest już określony.
  • CS9242: Klauzula ograniczenia "zezwala" musi być ostatnim ograniczeniem określonym.
  • CS9243: Nie można zezwolić na struktury ref dla parametru typu znanego z innych ograniczeń jako klasy.
  • CS9244: Typ może nie być parametrem ref struct lub typem umożliwiającym struktury ref w celu użycia go jako parametru w typie ogólnym lub metodzie.
  • CS9245: Typ nie może zaimplementować elementu członkowskiego interfejsu dla ref struct typu.
  • CS9246: Nie można uzyskać dostępu do elementu członkowskiego interfejsu wystąpienia niewirtualnego w parametrze typu, który umożliwia strukturę ref.
  • CS9247: instrukcja foreach nie może działać na modułach wyliczających typu, ponieważ jest to parametr typu, który umożliwia strukturę refruktury i nie jest znany w czasie kompilacji w celu zaimplementowania IDisposableelementu .
  • CS9267: Typ elementu iteratora może nie być strukturą ref lub parametrem typu umożliwiającym struktury ref

Przed C# 13 ref struct typy nie mogą implementować interfejsów; kompilator generuje CS8343. Począwszy od języka C# 13, ref struct typy mogą implementować interfejsy, zgodnie z następującymi regułami:

  • ref struct Nie można przekonwertować obiektu na wystąpienie implementowanego interfejsu. To ograniczenie obejmuje niejawną ref struct konwersję w przypadku użycia typu jako argumentu, gdy parametr jest typem interfejsu. Konwersja powoduje konwersję boksu, która narusza bezpieczeństwo ref.
  • Element ref struct implementujący interfejs musi implementować wszystkie elementy członkowskie interfejsu. Element ref struct musi implementować elementy członkowskie, w których interfejs zawiera domyślną implementację.

Począwszy od języka C# 13, ref struct można użyć jako argumentu typu dla parametru typu ogólnego, jeśli i tylko wtedy, gdy parametr typu ogólnego ma allows ref struct ograniczenie. W przypadku korzystania z allows ref struct ograniczeń antywłaściwych należy przestrzegać następujących reguł:

  • A ref struct jest używany jako argument typu, parametr typu musi mieć allows ref struct ograniczenie przeciw.- Ograniczenie allows ref struct anty-ograniczenie musi być ostatnie w where klauzuli dla tego parametru.
  • Użycie wystąpień parametru typu musi przestrzegać reguł bezpieczeństwa ref.
  • Argument ref struct typu lub, który może być typemref struct, nie może być używany jako typ elementu dla metody iteratora.