首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么DbParameterCollection中的三个属性在引用程序集中是抽象的,而在引用程序集中是虚拟的?

为什么DbParameterCollection中的三个属性在引用程序集中是抽象的,而在引用程序集中是虚拟的?
EN

Stack Overflow用户
提问于 2017-05-26 16:38:54
回答 1查看 2.8K关注 0票数 70

我正在将一个项目从project.json迁移到新型的csproj格式,其中包含一个从DbParameterCollection派生的类。在我的实际项目中,我使用了多目标,但对于这个问题,我们只需要关心net45

编译器告诉我,我必须重写三个以前不必重写的属性:

如果您遵循这些文档链接(用于.NET 4.5),您将看到所有属性都是虚拟的,而不是抽象的。如果我仅仅通过调用csc来构建代码,那么一切都很好……只有在使用.NET Core SDK时,我才会遇到这个问题。

下面是重现该问题的示例代码:

项目文件:

代码语言:javascript
运行
复制
<Project Sdk="Microsoft.NET.Sdk">    
  <PropertyGroup>
    <TargetFramework>net45</TargetFramework>
  </PropertyGroup>    
</Project>

C#代码:

代码语言:javascript
运行
复制
using System;
using System.Collections;
using System.Data.Common;

public class DummyParameterCollection : DbParameterCollection
{
    public override int Count => 0;
    public override object SyncRoot => null;
    public override void Remove(object value) {}
    public override void RemoveAt(int index) {}
    public override void RemoveAt(string parameterName) {}
    public override int Add(object value) => 0;
    public override void Insert(int index, object value) {}
    public override void AddRange(Array values) {}
    public override void Clear() {}
    public override bool Contains(object value) => false;
    public override bool Contains(string value) => false;
    public override void CopyTo(Array array, int index) {}
    public override int IndexOf(object value) => -1;
    public override int IndexOf(string parameterName) => -1;
    protected override DbParameter GetParameter(int index) => null;
    protected override DbParameter GetParameter(string parameterName) => null;
    protected override void SetParameter(int index, DbParameter value) {}
    protected override void SetParameter(string parameterName, DbParameter value) {}
    public override IEnumerator GetEnumerator() => null;
}

错误:

DummyParameterCollection.cs(5,14):错误CS0534:“”DummyParameterCollection“”未实现继承的抽象成员“”DbParameterCollection.IsSynchronized.get“”not

DummyParameterCollection.cs(5,14):错误CS0534:“”DummyParameterCollection“”未实现继承的抽象成员“”DbParameterCollection.IsFixedSize.get“”not“”

DummyParameterCollection.cs(5,14):错误CS0534:“”DummyParameterCollection“”未实现继承的抽象成员“”DbParameterCollection.IsReadOnly.get“”not“”

我相信我知道问题的直接原因,但不知道为什么会这样,也不知道最好的解决方法。

看起来像是.NET Core SDK (以及加载此项目时的VS2017 )使用了引用程序集。如果我在反射器中打开C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll,它也会显示属性是抽象的。然而,如果我打开c:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll,它会显示属性是虚拟的。

我可以通过覆盖属性并从所有属性返回false来解决这个问题-但这是处理这种情况的最好方法吗?除此之外,在这种情况下,为什么引用程序集与真正的程序集(和文档)不匹配,有什么好的理由吗?我希望引用程序集是自动生成的,所以有些事情像这样不正确是很奇怪的……

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44197176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档