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 parametremref struct
lub typem, który zezwala naref struct
. - CS8345: Właściwość pola lub zaimplementowana automatycznie nie może być typu, chyba że jest członkiem wystąpienia
ref struct
klasy . - CS9048:
scoped
Modyfikator może służyć tylko do refs iref struct
wartości. - CS9050:
ref
Pole nie może odwoływać się do elementuref 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
IDisposable
elementu . - 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 struct
klasy . - CS9048:
scoped
Modyfikator może służyć tylko do refs iref struct
wartości. - CS9050:
ref
Pole nie może odwoływać się do elementuref struct
. - CS9059:
ref
Pole można zadeklarować tylko w obiekcieref 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 zaimplementowaneref
właściwości. - Modyfikator może zawierać
scoped
tylkoref struct
typy lubref
zmienne. ref
Pole można zadeklarować tylko w typieref struct
.- Pole
ref
nie może odwoływać się doref 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 struct
typ 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 parametremref struct
lub typem, który zezwala naref 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
IDisposable
elementu . - 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. Elementref 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.- Ograniczenieallows ref struct
anty-ograniczenie musi być ostatnie wwhere
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.