我正在将一个项目从project.json
迁移到新型的csproj格式,其中包含一个从DbParameterCollection
派生的类。在我的实际项目中,我使用了多目标,但对于这个问题,我们只需要关心net45
。
编译器告诉我,我必须重写三个以前不必重写的属性:
如果您遵循这些文档链接(用于.NET 4.5),您将看到所有属性都是虚拟的,而不是抽象的。如果我仅仅通过调用csc
来构建代码,那么一切都很好……只有在使用.NET Core SDK时,我才会遇到这个问题。
下面是重现该问题的示例代码:
项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net45</TargetFramework>
</PropertyGroup>
</Project>
C#代码:
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
来解决这个问题-但这是处理这种情况的最好方法吗?除此之外,在这种情况下,为什么引用程序集与真正的程序集(和文档)不匹配,有什么好的理由吗?我希望引用程序集是自动生成的,所以有些事情像这样不正确是很奇怪的……
https://stackoverflow.com/questions/44197176
复制相似问题