Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA1033 |
| Tytuł | Metody interfejsu powinny móc zostać wywołane przez typy podrzędne |
| Kategoria | Projekt |
| Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Nie. |
Przyczyna
Niezapieczętowany typ widoczny na zewnątrz zapewnia jawną implementację metody interfejsu publicznego i nie dostarcza alternatywnej metody widocznej z zewnątrz o tej samej nazwie.
Opis reguły
Rozważ typ podstawowy, który jawnie implementuje metodę interfejsu publicznego. Typ pochodzący z typu podstawowego może uzyskać dostęp do dziedziczonej metody interfejsu tylko za pośrednictwem odwołania do bieżącego wystąpienia (this w języku C#), który jest rzutowany na interfejs. Jeśli typ pochodny zostanie ponownie wdrożony (jawnie) dziedziczonej metody interfejsu, nie można uzyskać dostępu do implementacji podstawowej. Wywołanie za pośrednictwem bieżącego odwołania do wystąpienia wywoła implementację pochodną; Powoduje to rekursję i ewentualne przepełnienie stosu.
Ta reguła nie zgłasza naruszenia jawnej implementacji System.IDisposable.Dispose , gdy podano zewnętrznie widoczną Close() lub System.IDisposable.Dispose(Boolean) metodę.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zaimplementuj nową metodę, która uwidacznia tę samą funkcjonalność i jest widoczna dla typów pochodnych lub zmienia się na implementację nonexplicit. Jeśli zmiana powodująca niezgodność jest akceptowalna, alternatywą jest zapieczętować typ.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli podano zewnętrznie widoczną metodę, która ma tę samą funkcjonalność, ale inną nazwę niż jawnie zaimplementowana metoda.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1033
// The code that's violating the rule is on this line.
#pragma warning restore CA1033
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1033.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykład
W poniższym przykładzie pokazano typ , ViolatingBasektóry narusza regułę i typ , FixedBasektóry pokazuje poprawkę naruszenia.
public interface ITest
{
void SomeMethod();
}
public class ViolatingBase : ITest
{
void ITest.SomeMethod()
{
// ...
}
}
public class FixedBase : ITest
{
void ITest.SomeMethod()
{
SomeMethod();
}
protected void SomeMethod()
{
// ...
}
}
sealed public class Derived : FixedBase, ITest
{
public void SomeMethod()
{
// The following would cause recursion and a stack overflow.
// ((ITest)this).SomeMethod();
// The following is unavailable if derived from ViolatingBase.
base.SomeMethod();
}
}