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());
}
}
}
以下は、エラーリストのエラーです。
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
ここで成功と失敗のシナリオを伴う.NETフィドル
コンパイラが非常に多くのエラーを出した理由は、で識別子を期待して<>
いたのに、string
そこにキーワード()を入れたためです。その結果、コンパイラが混乱し、構文解析が非常に間違っていました。は識別子Guid
であるため、を使用するとエラーがはるかに少なくなるのもこのためGuid
です。しかし、に置き換えることもあなたが期待することをstring
しGuid
ません。
非常に特殊な場合、つまり、がである場合DemoRepository
にのみ実装したいようです。IDemoRepository
K
string
実装の要件IDemoRepository
は、ジェネリック Get
メソッドを持ち、任意の型をとることができK
、を返すことであることに注意してくださいDto.Message
。それが意味するものです:
public interface IGet<T>
{
T Get<K>(K id);
}
public interface IDemoRepository : IGet<Dto.Message>
{
}
それはあなたが実際IDemoRepository
に要求したいものではないと思いますか?非ジェネリックGet
メソッドのみが必要な場合。これは、実装者が選択できる特定のタイプを取り、K
次のようなことを行うことができます。
// 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)
{
...
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加