我正在将项目从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” [c:\ Users \ skeet \ Test \ ParameterCollection \ ParameterCollection.csproj]
DummyParameterCollection.cs(5, 14):错误CS0534:'DummyParameterCollection'未实现继承的抽象成员'DbParameterCollection.IsFixedSize.get'[c:\ Users \ skeet \ Test \ ParameterCollection \ ParameterCollection.csproj]
DummyParameterCollection.cs(5,14):错误CS0534: 'DummyParameterCollection'未实现继承的抽象成员'DbParameterCollection.IsReadOnly.get'[c:\ Users \ skeet \ Test \ ParameterCollection \ ParameterCollection.csproj]
我相信我知道问题的直接原因,但不知道为什么会这样或最好的解决方法。
看起来.NET Core SDK(以及在加载此项目时为VS2017)使用引用程序集。如果我C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll
在Reflector中打开,则该属性也将显示为抽象。而如果打开c:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll
,则该属性显示为虚拟。
我可以通过重写属性并false
从所有属性中返回来解决此问题,但这是处理这种情况的最佳方法吗?除此之外,在这种情况下,参考程序集与实际程序集(和文档)不匹配有什么充分的理由吗?我希望参考程序集会自动生成,因此有些事情像这样不正确是很奇怪的...
abstract
而v4.5.1以后的版本都具有虚拟属性。至于为什么它们不同?我不能不说就说。