Почему члены не могут быть доступны по типу - PullRequest
0 голосов
/ 04 июня 2019

Я не понимаю, что я делаю неправильно, когда пытаюсь получить доступ к членам класса из универсального типа T. Я также специально использовал ограничение WHERE.Я получаю следующее сообщение: «T» - это параметр типа, который недопустим в текущем контексте.

class Test
{
    public static int id = 1;
    public int GetId()
    {
        return id;
    }
}

public class TestUsage
{
    public int IncrementId<T>() where T : Test
    {
        return 1 + T.GetId();
    }
}

Ответы [ 3 ]

1 голос
/ 04 июня 2019

Объявление метода как универсального означает, что вы можете передать аргумент универсального типа. Так что вы можете сделать это:

public class TestUsage
{
    public int IncrementId<T>(T test) where T : Test
    {
        return 1 + test.GetId();
    }
}

Аргумент общего типа T ничего не значит, если что-то с этим типом не используется в качестве входного аргумента, возвращаемого значения, переменной типа T внутри метода или некоторой комбинации.

1 голос
/ 04 июня 2019

Поскольку в public int IncrementId<T>(T test) параметр типа T может быть просто любого типа, C # не имеет ни малейшего представления, какие члены имеет этот тип.Вы можете добавить ограничение общего типа.Способ сделать это состоит в том, чтобы определить интерфейс, который типы должны реализовать для использования в качестве аргумента типа.

public interface IHasId
{
    int GetId();
}

class Test : IHasId
{
    public static int id = 1;
    public int GetId()
    {
        return id;
    }
}

public int IncrementId<T>(T item) where T : IHasId
{
    return item.GetId() + 1;
}

Другой вариант - передать метод доступа к свойству методу

* 1008.*

Вы бы назвали его с помощью

int nextId = IncrementId(test, t => t.GetId());

См. Также:

0 голосов
/ 04 июня 2019

Вы не предоставляете экземпляр T. Попробуйте:

public int IncrementId<T>(T t) where T : Test
{
    return 1 + t.GetId();
}
...