Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Kompilator języka C# generuje błędy i ostrzeżenia podczas deklarowania wyrażeń interpolacji ciągów lub procedur obsługi interpolacji ciągów z nieprawidłową składnią lub używania ich w nieobsługiwanych kontekstach. Ta diagnostyka ułatwia identyfikowanie problemów z interpolacjami ciągów lub niestandardowymi procedurami interpolacji ciągów.
- CS8361: Wyrażenie warunkowe nie może być używane bezpośrednio w interpolacji ciągów, ponieważ ciąg ":" kończy interpolację. Nawiasy wyrażenia warunkowego.
- CS8941: Metoda obsługi ciągów interpolowanych jest źle sformułowana. Nie zwraca wartości "void" ani "bool".
- CS8942: Metoda obsługi ciągów interpolowanych ma niespójny typ zwracany. Oczekuje się, że zostanie zwrócony inny typ.
- CS8946: Typ nie jest typem procedury obsługi ciągów interpolowanych.
- CS8947: Parametr występuje po parametrze modulatora ciągów interpolowanych na liście parametrów, ale jest używany jako argument dla konwersji modulatora ciągów interpolowanych. Wymaga to od wywołującego zmiany kolejności parametrów z nazwanymi argumentami w miejscu wywołania. Rozważ umieszczenie parametru modulatora ciągów interpolowanych po wszystkich zaangażowanych argumentach.
- CS8953: Konstrukcja obsługi ciągów interpolowanych nie może korzystać z dynamic. Zamiast tego skonstruuj wystąpienie ręcznie.
- CS8976: Konwersje obsługi ciągów interpolowanych odwołujące się do indeksowanego wystąpienia nie mogą być używane w inicjatorach składowych indeksatora.
- CS9205: Oczekiwany ciąg interpolowany.
- CS9325: Argumenty procedury obsługi ciągów interpolowanych nie są dozwolone w tym kontekście.
Składnia wyrażenia interpolacji
- CS8361 - Nie można użyć wyrażenia warunkowego bezpośrednio w interpolacji łańcucha znaków, ponieważ znak ':' kończy interpolację. Użyj nawiasów wokół wyrażenia warunkowego.
- CS9205 - Oczekiwano ciągu interpolowanego.
Aby naprawić te błędy, zastosuj następujące techniki:
- Zawijaj wyrażenia warunkowe (operator ternary
?:) w nawiasach podczas ich używania wewnątrz miejsca interpolacji (CS8361). Dwukropek ma szczególne znaczenie w ciągach interpolowanych, ponieważ wprowadza formatowanie ciągów, więc kompilator interpretuje:wcondition ? true : falsejako specyfikator formatu, zamiast części wyrażenia warunkowego. Na przykład użyj$"{(x > 0 ? "positive" : "negative")}"zamiast$"{x > 0 ? "positive" : "negative"}". - Upewnij się, że podasz interpolowany literał ciągu, jeśli jest oczekiwany (CS9205). Ten błąd występuje, gdy kompilator oczekuje ciągu interpolowanego (począwszy od
$"lub$@"), ale napotka inny typ wyrażenia.
Implementacja typu obsługi ciągów interpolowanych
- CS8941 - Metoda obsługi ciągów interpolowanych jest źle sformułowana. Nie zwraca wartości "void" ani "bool".
- CS8942 - Metoda obsługi ciągów interpolowanych ma niespójny typ zwracany. Oczekuje się, że zostanie zwrócony inny typ.
- CS8946 - Typ nie jest typem procedury obsługi ciągów interpolowanych.
Podczas implementowania niestandardowej procedury obsługi ciągów interpolowanych zastosuj następujące techniki:
- Upewnij się, że wszystkie
AppendLiteralmetody iAppendFormattedzwracają wartośćvoidlubbool(CS8941). Wzorzec obsługi wymaga, aby te metody miały jeden z tych typów zwracanych, aby kompilator mógł prawidłowo wygenerować kod interpolacji. Metody zwracająceboolumożliwiają krótkołącze, gdy obsługujący decyduje, że dalsze przetwarzanie nie jest konieczne. - Upewnij się, że wszystkie metody dołączania w typie procedury obsługi używają tego samego typu zwracanego (CS8942). Jeśli jedna metoda zwraca
voidwartość , wszystkie metody dołączania muszą zwrócić wartośćvoid. Jeśli jeden zwraca wartośćbool, wszystkie muszą zwrócić wartośćbool. Mieszanie typów zwracanych uniemożliwia kompilatorowi generowanie spójnego kodu interpolacji. - Zastosuj element InterpolatedStringHandlerAttribute do typu procedury obsługi i upewnij się, że ma prawidłowy konstruktor (CS8946). Typ procedury obsługi ciągów interpolowanych musi być oznaczony tym atrybutem i postępować zgodnie ze wzorcem obsługi rozpoznawanym przez kompilator.
Ograniczenia użycia programu obsługi ciągów interpolowanych
- CS8947 - Parametr występuje po parametrze obsługi ciągów interpolowanych na liście parametrów, ale jest używany jako argument dla konwersji obsługi ciągów interpolowanych. Wymaga to od użytkownika zmiany kolejności parametrów z nazwanymi argumentami w miejscu wywołania. Rozważ umieszczenie parametru obsługi ciągów interpolowanych po wszystkich zaangażowanych argumentach.
- CS8953 - Konstrukcja obsługi ciągów interpolowanych nie może używać obiektów dynamicznych. Ręcznie skonstruuj wystąpienie elementu "{0}".
- CS8976 - Konwersje programu obsługi ciągów interpolowanych dotyczące instancji, do której odwołuje się indeks, nie mogą być używane w inicjatorach składowych indeksatora.
- CS9325 - Argumenty procedury obsługi ciągów interpolowanych nie są dozwolone w tym kontekście.
W przypadku korzystania z procedur obsługi ciągów interpolowanych zastosuj następujące techniki:
- Zmień kolejność parametrów metody tak, aby parametry używane przez InterpolatedStringHandlerArgumentAttribute pojawiły się przed parametrem obsługiwanym ciągów interpolowanych (CS8947). To ostrzeżenie wskazuje, że osoby wywołujące muszą używać nazwanych argumentów do prawidłowego wywoływania metody, co zmniejsza użyteczność. Umieść parametr programu obsługi po wszystkich argumentach, od których zależy.
- Nie używaj
dynamicwartości wpisanych jako argumentów do konwersji obsługi ciągów interpolowanych (CS8953). Kompilator nie może określić wymagań dotyczących konstrukcji programu obsługi w czasie kompilacji, gdy są zaangażowane wartości dynamiczne. Zamiast tego ręcznie skonstruuj wystąpienie handlera i wywołaj jego metody bezpośrednio. - Nie używaj ciągów interpolowanych odwołujących się do wystąpienia zainicjowanego w inicjatorach składowych indeksatora (CS8976). Podczas inicjalizacji obiektu jego instancja nie jest jeszcze w pełni skonstruowana, dlatego konwersje obsługiwane przez
this, które się do niej odwołują, nie są dozwolone. Użyj oddzielnej instrukcji po zainicjowaniu, aby ustawić wartość indeksatora. - Sprawdź kontekst, w którym używasz argumentów procedury obsługi ciągów interpolowanych (CS9325). Niektóre konteksty nie obsługują atrybutów argumentów obsługi. W takich przypadkach użyj zwykłego ciągu interpolowanego lub ręcznie skonstruuj procedurę obsługi.