Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缺少C#通用通配符<;的解决方法是什么&燃气轮机;_C#_.net_Generics_Wildcard - Fatal编程技术网

缺少C#通用通配符<;的解决方法是什么&燃气轮机;

缺少C#通用通配符<;的解决方法是什么&燃气轮机;,c#,.net,generics,wildcard,C#,.net,Generics,Wildcard,在Java中,我可以声明如下方法:public boolean doSth(Cache-Cache,CacheItem-item){…} public interface Cache<T> { public boolean Contains(T item); } public class CacheFilePath implements Cache<FilePathItem> { @Override public boolean Contains

在Java中,我可以声明如下方法:
public boolean doSth(Cache-Cache,CacheItem-item){…}

public interface Cache<T> {
    public boolean Contains(T item);
}

public class CacheFilePath implements Cache<FilePathItem> {
    @Override
    public boolean Contains(FilePathItem item) {
        return false; // TODO
    }
}

public class ItemHandler {

    public boolean doSth(Cache<?> cache, CacheItem item){
        if(cache instanceof CacheHostName && item instanceof HostNameItem){
            CacheHostName c = (CacheHostName) cache;
            HostNameItem i = (HostNameItem) item;
            return check(c, i);
        }
        else if(cache instanceof CacheFilePath && item instanceof FilePathItem){
            CacheFilePath c = (CacheFilePath) cache;
            FilePathItem i = (FilePathItem) item;
            return check(c, i);
        }
        throw new RuntimeException("Invalid arguments  !!!");
    }

    private boolean check(Cache<HostNameItem> cache, HostNameItem item){
        return cache.Contains(item);
    }

    private boolean check(Cache<FilePathItem> cache, FilePathItem item){
        return cache.Contains(item);
    }
}
公共接口缓存{
公共布尔包含(T项);
}
公共类CacheFilePath实现缓存{
@凌驾
公共布尔包含(FilePathItem项){
返回false;//TODO
}
}
公共类ItemHandler{
公共布尔doSth(缓存、缓存项){
if(缓存主机名的缓存实例和主机名项目的项目实例){
CacheHostName c=(CacheHostName)缓存;
HostNameItem i=(HostNameItem)项;
退票(c,i);
}
else if(CacheFilePath的缓存实例&filepath项目的项目实例){
CacheFilePath c=(CacheFilePath)缓存;
FilePathItem i=(FilePathItem)项;
退票(c,i);
}
抛出新的RuntimeException(“无效参数!!!”);
}
私有布尔检查(缓存、主机名项){
返回cache.Contains(项);
}
私有布尔检查(缓存、FilePathItem){
返回cache.Contains(项);
}
}

如何在C#中声明这样一个方法?

您可以在该方法上声明一个类型参数,如下所示:

public boolean doSth<T>(Cache<T> cache, CacheItem item){
    ...
}
publicbooleandosth(缓存、缓存项){
...
}
或使用非泛型基类或接口:

public interface ICache { ... }
public class Cache<T> : ICache { ... }

public boolean doSth(ICache cache, CacheItem item){
    ...
}
公共接口ICache{…}
公共类缓存:ICache{…}
公共布尔DOTH(ICache缓存,CacheItem){
...
}

为什么使方法泛化并不能解决您的问题?顺便说一句,让一个方法泛型,然后在一堆派生类型之间切换,然后对它们进行操作,这通常是代码的味道。通常情况下,您应该只使用N个重载,而不是一堆类型检查和强制转换。通过泛型类实现使用
对象
的接口,以及使用特定类型的相同方法,通常可以避免此问题。如果
Cache
不执行此操作,并且它不是您可以修改的,则最接近上述代码的方法是接受
object
,并手动键入check,以检查
typeof(Cache)