Две вещи способствовали этому:
Когда вы реализуете интерфейсы явно, C # ожидает, что вы сможете присвоить имя участника с именем наименее производного интерфейса, а не имя интерфейса, которое может наследовать от него.
Чтобы исправить ваш код, вам нужно сделать это:
public class User : IUser
{
string IUser<string>.UserName { get { return Email;} set { Email = value;}}
}
Пример бонуса
Вот полный пример, который генерирует одно и то же сообщение об ошибке:
public interface Base
{
string MyProperty { get; set; }
}
public interface Inherited : Base
{
}
public class Implementor : Inherited
{
string Inherited.MyProperty { get; set; }
}