C#接口<;T>;{T Func<;T>;(T T);}:具有泛型返回类型的参数化方法的泛型接口

C#接口<;T>;{T Func<;T>;(T T);}:具有泛型返回类型的参数化方法的泛型接口,c#,generics,C#,Generics,我想我应该使用一些(我认为是)简单的泛型在一些业务类上强制使用CRUD。 例如 公共接口IReadable { T读取(字符串ID); } 然后,也许我可以有一个NoteAdapter来使用Note类eg执行CRUD public class NoteAdapter : IReadable<Note> { public Note Read<Note>(string ID) { return new Note(); } } public类

我想我应该使用一些(我认为是)简单的泛型在一些业务类上强制使用CRUD。 例如

公共接口IReadable
{
T读取(字符串ID);
}
然后,也许我可以有一个NoteAdapter来使用Note类eg执行CRUD

public class NoteAdapter : IReadable<Note>
{
    public Note Read<Note>(string ID) {
        return new Note();
    }
}
public类NoteAdapter:IReadable
{
已读取公共注释(字符串ID){
退回新票据();
}
}
但出于某种原因,如果我同时拥有一个泛型返回类型和一个使用相同泛型类型参数化的函数,那么te编译器就会感到困惑。也就是说,如果我这样做:

public interface IReadable <T>
{
    void Read<T>(string ID);
}
public class NoteAdapter : IReadable<Note>
{
    public void Read<Note>(string ID) {
        return new Note();
    }
}
公共接口IReadable
{
无效读取(字符串ID);
}
公共类NoteAdapter:IReadable
{
公共无效读取(字符串ID){
退回新票据();
}
}
它编译得很好,尽管它不符合我的要求! 此外,这:

public interface IReadable <T>
{
    T Read (string ID);
}
public class NoteAdapter : IReadable<Note>
{
    public Note Read(string ID) {
        return new Note();
    }
}
公共接口IReadable
{
T读取(字符串ID);
}
公共类NoteAdapter:IReadable
{
已读取公共注释(字符串ID){
退回新票据();
}
}
也可以正常工作,尽管它也不满足要求!——为什么? 因为我不能有一个类来实现这些接口

public interface IReadable <T>{
    T Read (string ID);
}
public class UniversalAdapter : IReadable<Note>, IReadable<Customer> ...
{
    public Note Read(string ID) {
        return new Note();
    }
    public Customer Read(string ID) {
        return new Customer();
    }
}
公共接口IReadable{
T读取(字符串ID);
}
公共类通用适配器:IReadable,IReadable。。。
{
已读取公共注释(字符串ID){
退回新票据();
}
公共客户读取(字符串ID){
返回新客户();
}
}
因为这不会编译,因为返回类型不是方法签名的一部分

我当时的印象是,在C#3.5+

tfoo(tt);
T Foo(T T),;
T Foo(someInstance);

都有不同的签名!我错过了什么

公共接口IReadable { T读取(字符串ID); }

这里有两个不同的Ts:
IReadable和T Read(字符串ID)

也许只是


公共接口IReadable
{
T读取(字符串ID);
}

因为否则等于


公共接口IReadable
{
X读取(字符串ID);
}

编辑:


可能您需要公共接口IReadable{T Read(T ID);}?

按返回类型重载CIL方法。

您过度指定了接口。在接口定义中声明
T
,然后在方法定义中重新声明:

public interface IReadable <T>  /* T is declared here */
{
    T Read<T>(string ID); /* here, you've declare a NEW generic type parameter */
                          /* that makes this T not the same as the T in IReadable */
}
编辑:


好吧,我读了你文章的其余部分,你似乎已经发现这个“有效”,但你似乎认为它是错误的。为什么?这不符合什么要求?

是的,具体来说,您需要:公共接口IReadable{T Read(string ID);},因此这里只有一个实际的泛型参数,即接口类型定义的T。请参阅。。那可以编译,但这不是我要找的。。因为我可能会有一个适配器类,它将实现一组IReadable,例如IReadable,IReadable等等。。这将不起作用,因为所有这些“T读取(字符串ID)”将计算为相同的函数,即它不允许在同一类中“注释读取(字符串ID)”;以及“客户读取(字符串ID)”~一如既往…谢谢你的帮助!公共接口可读取{T Read(T ID);}?你说得对,伙计。。我的错。。我删除了这个坏例子,但我的观点是它确实是接口{T Read{string id}-它似乎只能将一个Methods ReturnType或Methods参数与接口的类型匹配,但不能同时匹配!Thx代表您的时间!Thx代表您的帮助..这并不是因为我认为有效的方法是错误的,而是我的期望是CLR将两个泛型类型等同起来..一个是接口,另一个是M上的ethod..即接口的T将与T Read的返回类型以及Read相同;但实际上,它只将接口的“T”与返回类型匹配
T Foo(T t);
T Foo<T> (T t);
T Foo(<SomeType> someInstance);
public interface IReadable <T>  /* T is declared here */
{
    T Read<T>(string ID); /* here, you've declare a NEW generic type parameter */
                          /* that makes this T not the same as the T in IReadable */
}
public class NoteAdapter : IReadable<Note> /* IReadable defines T to be Note */
{
    public Note Read<Note>(string ID) { /* Here, you're declaring a generic parameter */
                                        /* named Note.  This name then conflicts with */
                                        /* the existing type name Note */
        return new Note();
    }
}
public interface IReadable <T>
{
    T Read(string ID);
}
public class NoteAdapter : IReadable<Note>
{
    public Note Read(string ID) {
        return new Note();
    }
}