Usuwanie błędów i ostrzeżeń dla wyrażeń interpolacji ciągów

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 : w condition ? true : false jako 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 AppendLiteral metody i AppendFormatted zwracają wartość void lub bool (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ące bool umoż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 dynamic wartoś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.