Ich verschiebe ein Projekt von project.json
in das neue csproj-Format und es enthält eine Klasse, die von abgeleitet ist DbParameterCollection
. In meinem eigentlichen Projekt verwende ich Multi-Targeting, aber für die Zwecke dieser Frage müssen wir uns nur darum kümmern net45
.
Der Compiler sagt mir, dass ich drei Eigenschaften überschreiben muss, die ich vorher nicht musste:
Wenn Sie diesen Dokumentationslinks (für .NET 4.5) folgen, werden Sie feststellen, dass alle Eigenschaften virtuell und nicht abstrakt sind. Wenn ich den Code nur durch Aufrufen erstelle, csc
ist alles in Ordnung. Nur wenn ich das .NET Core SDK verwende, stoße ich auf das Problem.
Hier ist ein Beispielcode, um das Problem zu reproduzieren:
Projektdatei:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net45</TargetFramework>
</PropertyGroup>
</Project>
C # -Code:
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;
}
Fehler:
DummyParameterCollection.cs (5,14): Fehler CS0534: 'DummyParameterCollection' implementiert das geerbte abstrakte Mitglied 'DbParameterCollection.IsSynchronized.get' nicht [c: \ Users \ skeet \ Test \ ParameterCollection \ ParameterCollection.csproj]
DummyParameterCollection.cs (5) 14): Fehler CS0534: 'DummyParameterCollection' implementiert kein geerbtes abstraktes Mitglied 'DbParameterCollection.IsFixedSize.get' [c: \ Users \ skeet \ Test \ ParameterCollection \ ParameterCollection.csproj]
DummyParameterCollection.cs (5,14): Fehler CS0534: 'DummyParameterCollection' implementiert kein geerbtes abstraktes Mitglied 'DbParameterCollection.IsReadOnly.get' [c: \ Users \ skeet \ Test \ ParameterCollection \ ParameterCollection.csproj]
Ich glaube, ich kenne die unmittelbare Ursache des Problems, aber nicht die Gründe, warum es so ist, oder die beste Problemumgehung.
Es sieht so aus, als ob das .NET Core SDK (und VS2017 beim Laden dieses Projekts) die Referenzassemblys verwendet. Wenn ich C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll
in Reflector öffne , werden die Eigenschaften ebenfalls als abstrakt angezeigt. Wenn ich dagegen öffne c:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll
, werden die Eigenschaften als virtuell angezeigt.
Ich kann dies umgehen, indem ich die Eigenschaften überschreibe und einfach false
von allen zurückkehre - aber ist das der beste Weg, um mit dieser Situation umzugehen? Gibt es darüber hinaus einen guten Grund, warum die Referenzbaugruppen in diesem Fall nicht mit den tatsächlichen Baugruppen (und der Dokumentation) übereinstimmen? Ich würde erwarten, dass die Referenzbaugruppen automatisch generiert werden, daher ist es seltsam, dass einige Dinge so falsch sind ...
abstract
ab v4.5.1 virtuell waren. Warum unterscheiden sie sich? Ich kann nicht sagen, ohne zu raten.