在C#中实现接口的通用方法时,我遇到了奇怪的错误。这里到底出了什么问题? 公共接口IGet { T-Get(K-id); } 公共接口IDemoRepository:IGet { } 公共类DemoRepository:IDemoRepository { public Dto.Message Get(字符串messageId) { 使用(var db=new AppDbContext()) { 返回db.Messages .FirstOrDefault(f=>f.MessageId.ToLower()==MessageId.ToLower()); } } }

在C#中实现接口的通用方法时,我遇到了奇怪的错误。这里到底出了什么问题? 公共接口IGet { T-Get(K-id); } 公共接口IDemoRepository:IGet { } 公共类DemoRepository:IDemoRepository { public Dto.Message Get(字符串messageId) { 使用(var db=new AppDbContext()) { 返回db.Messages .FirstOrDefault(f=>f.MessageId.ToLower()==MessageId.ToLower()); } } },c#,generics,methods,interface,generic-method,C#,Generics,Methods,Interface,Generic Method,下面是错误列表中的错误 public interface IGet<T> { T Get<K>(K id); } public interface IDemoRepository : IGet<Dto.Message> { } public class DemoRepository : IDemoRepository { public Dto.Message Get<string>(string messageId)

下面是错误列表中的错误

public interface IGet<T>
{
    T Get<K>(K id);
}

public interface IDemoRepository : IGet<Dto.Message>
{

}

public class DemoRepository : IDemoRepository
{
    public Dto.Message Get<string>(string messageId)
    {
        using (var db = new AppDbContext())
        {
            return db.Messages
                .FirstOrDefault(f => f.MessageId.ToLower() == messageId.ToLower());
        }
    }
}
严重性代码描述
应为错误CS1001标识符
错误CS1003语法错误,应为“>”
错误CS1003语法错误,应为“(”
应为错误CS1001标识符
错误CS1003语法错误,应为“,”
错误CS1003语法错误,应为“,”
错误CS8124元组必须至少包含两个元素。
应为错误CS1001标识符
错误CS1026)应为空
错误CS0535“DemoRepository”未实现接口成员“IGet.Get(K)”
错误CS0103当前上下文中不存在名称“messageId”
NET处理成功和失败场景

该接口指定
Get
应采用通用参数,但您正试图使用
字符串
参数对其进行定义

或者更改
DemoRepository
以使
Get
通用(这在您的案例中似乎不起作用,因为您希望使用
.ToLower


或者将您的
Get
更改为非泛型。

编译器发出如此多错误的原因是它希望在
中有一个标识符,但您在那里放了一个关键字(
字符串
)。结果,编译器弄糊涂了,解析也大错特错。这也是为什么如果使用
Guid
,错误会少很多,因为
Guid
是一个标识符。但是用
Guid
替换
string
也不能达到预期效果

您似乎希望
DemoRepository
仅在非常特定的情况下实现
IDemoRepository
,即
K
string

注意,实现
IDemoRepository
的要求是它应该有一个通用的
Get
方法,能够接受任何类型的
K
,并返回
Dto.Message
。这就是所谓的:

Severity    Code    Description
Error       CS1001  Identifier expected
Error       CS1003  Syntax error, '>' expected  
Error       CS1003  Syntax error, '(' expected  
Error       CS1001  Identifier expected 
Error       CS1003  Syntax error, ',' expected  
Error       CS1003  Syntax error, ',' expected  
Error       CS8124  Tuple must contain at least two elements.   
Error       CS1001  Identifier expected 
Error       CS1026  ) expected  
Error       CS0535  'DemoRepository' does not implement interface member 'IGet<Dto.Message>.Get<K>(K)'  
Error       CS0103  The name 'messageId' does not exist in the current context  

在代码的哪些行上会弹出错误?很可能只有一个(或两个)错误,这会导致其他错误。重新开始输入,确保只有在没有您不希望出现的错误时才继续(例如,如果您还没有实现接口,可能会有关于接口的错误,但不会更多)。如果intellisense无法识别
f
@MindeSwipe,则不应键入
f.MessageId
。@MindeSwipe大多数错误都在第行:public Mail Get(string MessageId)我创建了一个.net fiddle,其中包括失败和成功两种情况@正如我在下面提到的,Rahul的Guid不是系统的Guid。尝试执行
id.ToByteArray()例如。您的Guid和K一样好,它只是一个通用参数。当我提供Guid而不是字符串时,它完全可以正常工作。使用字符串或int时出错。
Guid
被重新定义为通用参数。它实际上不是GUID结构。您可以使用
String
而不是
String
来尝试。您会收到“字符串隐藏类字符串”的警告,但它编译得很好。非常感谢。您是对的,IGet接口的定义不正确。
public interface IGet<T>
{
    T Get<K>(K id);
}

public interface IDemoRepository : IGet<Dto.Message>
{

}
// I moved the generic parameter K from the method to the interface
public interface IGet<T, K>
{
    T Get(K id);
}

public interface IDemoRepository<K> : IGet<Dto.Message, K>
{

}

// here the implementer chose string as K
public class DemoRepository : IDemoRepository<string>
{
    public Dto.Message Get(string messageId)
    {
        ...
    }
}