У меня есть следующие классы:
public abstract class TableStorageItem
{
public TableStorageItem() { }
}
public abstract class TableStorage<T> where T : TableStorageItem, new()
{
public async Task CheckInitializeAsync(CancellationToken cancellationToken = default)
{
...
}
}
public class TableStorageCleanerTask<T, U>
where T : TableStorage<U>
where U : TableStorageItem, new()
{
public TableStorageCleanerTask() { }
public async Task InitializeAsync(CancellationToken cancellationToken = default)
{
await T.CheckInitializeAsync(cancellationToken)
}
}
Я хотел бы вызвать CheckInitializeAsync изнутри InitializeAsync, но у меня есть ошибка компилятора CS0704:
Невозможно использовать невиртуальный элемент в T, поскольку это параметр типа.
Я уверен, что есть способ сделать это, но я не могу его понять.
Вы неверно процитировали текст ошибки. В нем должен быть поиск слова: Cannot do non-virtual member lookup in 'T' because it is a type parameter Лучше всего скопировать и вставить текст ошибки, когда задаете вопрос.
Я подозреваю, что отрицательные отзывы вызваны тем фактом, что текст ошибки и номер строки точно объясняют проблему. И быстрый поиск в Интернете укажет на решение. Одна из веских причин для отрицательного голосования — «не демонстрирует никаких исследовательских усилий».
@Wyck Я, конечно, провел исследование, в том числе Bing Copilot, потому что он потрясающе находит ответы. Но вы правы, возможно, я не скопировал/вставил текст ошибки.





Согласно комментарию @Sweeper, метод CheckInitializeAsync не является статическим, поэтому его нельзя вызвать для класса; только против объекта, созданного из этого класса.
public class TableStorageCleanerTask<T, U>
where T : TableStorage<U>
where U : TableStorageItem, new()
{
private T tableStorage;
public TableStorageCleanerTask(T tableStorage)
{
this.tableStorage = tableStorage;
}
public async Task InitializeAsync(CancellationToken cancellationToken = default)
{
await tableStorage.CheckInitializeAsync(cancellationToken)
}
}
вы пытаетесь вызвать метод экземпляра, например статический метод. Вам необходимо объявить свою функцию следующим образом, которая принимает экземпляр TableStorage, или вы можете создать новый экземпляр, а затем вызвать функцию CheckInitializeAsync() в InitializeAsync():
public class TableStorageCleanerTask<T, U>
where T : TableStorage<U>
where U : TableStorageItem, new()
{
public TableStorageCleanerTask() { }
public async Task InitializeAsync(T storage, CancellationToken cancellationToken = default)
{
await storage.CheckInitializeAsync(cancellationToken);
}
}
CheckInitializeAsyncне статичен. Почему вы ожидали, чтоT.CheckInitializeAsync(cancellationToken)сработает?