C# 为什么此处需要引用未使用的程序集

C# 为什么此处需要引用未使用的程序集,c#,reference,C#,Reference,我有一个引用dll的exe 在dll中有一些方法,我们感兴趣的两种方法是: private static CacheItemPolicy _policy = new CacheItemPolicy(); [MethodImpl(MethodImplOptions.NoInlining)] public static void SetValue(string Key, object Value) { SetValue(Key, Value, _policy); } [MethodImp

我有一个引用dll的exe

在dll中有一些方法,我们感兴趣的两种方法是:

private static CacheItemPolicy _policy = new CacheItemPolicy();

[MethodImpl(MethodImplOptions.NoInlining)]
public static void SetValue(string Key, object Value)
{
    SetValue(Key, Value, _policy);
}

[MethodImpl(MethodImplOptions.NoInlining)]
public static void SetValue(string Key, object Value, TimeSpan TTL)
{
    SetValue(Key, Value, GetPolicy(TTL));
}

[MethodImpl(MethodImplOptions.NoInlining)]
private static CacheItemPolicy GetPolicy(TimeSpan TTL)
{
    return new CacheItemPolicy()
    {
        SlidingExpiration = TTL
    };
}
在我的exe中,当我尝试调用此方法时:仅使用
cache.SetValue(key,item)它编译并工作正常,但是当使用
cache.SetValue(key,item,new TimeSpan(0,1,0))调用时我得到以下异常:

错误1在未引用的程序集中定义了类型“System.Runtime.Caching.CacheItemPolicy”。必须添加对程序集“System.Runtime.Caching,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用

为什么编译器会说我需要将这个引用添加到一个程序集,而我现在没有在代码中直接使用这个程序集

我肯定我错过了一些简单的东西。我看了,但它指的是接口,这里不是这样

编辑:还有以下内容:

protected static void SetValue(string Key, object Value, CacheItemPolicy Policy)
{
    // work is done here
}
但这是受保护的,调用exe的人不应该看到它


Edit2:当上面的
设置值
采用
缓存项策略
设置为
私有
内部
时,它会工作,为什么
受保护
(和
受保护内部
)会导致它需要程序集?

既然静态
设置值
受到保护,它对派生类可见


因此,如果您可以从类派生(即,它是公共的),那么您就有可能派生并使用该方法,这意味着需要引用。

是否有未显示的重载接受/返回CacheItemPolicy?我想知道这是否仅仅是一个重载解析的问题..嗨,Seph,如果你是指我的评论,那是因为受保护的对派生类是可见的。Private表示它仅限于那个特定的类,internal表示它仅限于同一个程序集。您能详细说明一下,尽管代码中没有其他更改,但当仅使用2个参数调用SetValue时,为什么不需要引用吗?据我所知,如何/为什么调用它并不重要。对于其他程序集可见的类的部分包括使用类型CacheItemPolicy,因为该类不是
密封的
,并且是
公共的
(大概是这样),它邀请类的用户从中派生。如果他们这样做了,那么他们将能够调用
SetValue
,该值采用
CacheItemPolicy
。这有帮助吗?解决方案:如果您不想让人们从类中派生,请将该类密封起来/使用
CacheItemPolicy
SetValue
重载为私有或内部(如果您从同一引用程序集中的该类派生,则可能是受保护的内部)。在这一点上,可能是因为您正在使用3个参数调用重载,而它不知道什么是
CacheItemPolicy
,因此它需要加载定义它的程序集,以便查看通过
TimeSpan
的调用是否打算调用基于
TimeSpan
的重载或
CacheItemPolicy
的重载。(例如,它想确定是否存在从
TimeSpan
CacheItemPolicy
的隐式转换)一种测试方法:您可以向
TimeSpan
CacheItemPolicy
版本的
SetValue
添加一个伪参数,这样它们就没有相同数量的参数。