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

本文关键字:未使用 程序集 引用 为什么 | 更新日期: 2023-09-27 18:20:25

我有一个引用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.Cacheching.CacheItemPolicy"是在未引用的程序集中定义的。必须添加对程序集"System.Runtime.Caching,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"的引用。

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

我确信我错过了一些简单的东西。我看了为什么我需要引用一个dll,我';我没有直接使用?但它指的是接口,这里的情况并非如此。

编辑:还有这个:

protected static void SetValue(string Key, object Value, CacheItemPolicy Policy)
{
    // work is done here
}

但这是受保护的,不应该对调用exe可见。

Edit2:当上面这个取CacheItemPolicySetValue设置为privateinternal时,它就工作了,为什么protected(和protected internal)会导致它需要程序集?

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

由于静态SetValue受到保护,因此它对派生类可见。

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