Je me déplace un projet à partir d' project.json
pour le nouveau-style csproj format, et il comprend une classe dérivée de l' DbParameterCollection
. Dans mon projet, je suis en utilisant le multi-ciblage, mais pour les fins de cette question, nous avons seulement besoin de se soucier net45
.
Le compilateur me dit que je dois remplacer les trois propriétés que je n'avais pas avant:
Si vous suivez ces liens vers la documentation (qui sont pour .NET 4.5, vous verrez que toutes les propriétés sont virtuels - pas abstraite. Si je construis le code, tout en appelant csc
, tout va bien... c'est seulement lors de l'utilisation de l' .NET SDK de Base que je tombe sur la question.
Voici un exemple de code pour reproduire le problème:
Dossier de projet:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net45</TargetFramework>
</PropertyGroup>
</Project>
Le code 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;
}
Erreurs:
DummyParameterCollection.cs(5,14): erreur CS0534: 'DummyParameterCollection" n'a pas hérité de mettre en œuvre abstraite membre 'DbParameterCollection.IsSynchronized.get' [c:\Users\skeet\Test\ParameterCollection\ParameterCollection.csproj]
DummyParameterCollection.cs(5,14): erreur CS0534: 'DummyParameterCollection" n'a pas hérité de mettre en œuvre abstraite membre 'DbParameterCollection.IsFixedSize.get' [c:\Users\skeet\Test\ParameterCollection\ParameterCollection.csproj]
DummyParameterCollection.cs(5,14): erreur CS0534: 'DummyParameterCollection" n'a pas hérité de mettre en œuvre abstraite membre 'DbParameterCollection.IsReadOnly.get' [c:\Users\skeet\Test\ParameterCollection\ParameterCollection.csproj]
Je crois que je connais la cause immédiate du problème, mais pas les raisons pourquoi c'est comme ça, ou la meilleure solution.
Il ressemble à l' .NET SDK de Base (et VS2017 quand il est chargé à ce projet) utilise la référence assemblées. Si j'ouvre l' C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll
dans le Réflecteur, qui montre les propriétés comme étant abstraite ainsi. Alors que si j'ouvre l' c:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll
, ce qui montre que les propriétés comme étant virtuel.
Je peux contourner ce problème en remplaçant les propriétés et le retour false
de tous - mais est-ce la meilleure façon de gérer cette situation? Au-delà, est-il une bonne raison pour laquelle les assemblies de référence ne correspond pas à la vraie assemblées (et la documentation) dans ce cas? J'attendrais la référence assemblées générée automatiquement, donc c'est bizarre pour certaines choses pour être incorrecte comme ça...