Аргументы типа для метода 'xyz' не могут быть выведены из использования - PullRequest
0 голосов
/ 03 июля 2018

Добрый день,

Я довольно долго искал в Google и stackoverflow, но пока не получил ответа. (По крайней мере, не тот ответ, который мне хотелось бы :))

Итак, вот краткий пример моего базового кода:

public interface IITem<IdType>
{
    IdType Id { get; set; }
}

public class Item<IdType> : IITem<IdType>
{
    public IdType Id { get; set; }
}    

public class MyItem : Item<Guid>
{
}

Теперь я хотел бы создать универсальный метод получения идентификаторов, что-то вроде этого:

private static TId GetId<TItem, TId>(TItem e) where TItem : IITem<TId>
{
    return e.Id;
}

Пока это хорошо, но теперь, когда я хочу использовать его, как в следующем примере, я получаю ошибку, упомянутую в заголовке:

var item = new MyItem()
{
    Id = Guid.NewGuid()
};
var id = GetId(item);

Это работает, когда я явно говорю все типы для него так:

var id = GetId<MyItem, Guid>(item);

Но я не хочу называть свой элемент, и тем более тип идентификатора (который определен внутри MyItem и не виден непосредственно в области использования GetId ()), который может быть совершенно другим для некоторых объектов.

Есть ли какое-нибудь исправление синтаксиса, которое я мог бы сделать, чтобы я мог заставить этот GetId () работать без подсказок каких-либо типов для него?

Спасибо!

1 Ответ

0 голосов
/ 03 июля 2018

Какой цели служат общие ограничения для GetId?

Просто используйте общий тип интерфейса напрямую:

private static TId GetId<TId>(IITem<TId> e)
{
    return e.Id;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...