因此,我们尝试弃用一些现有的类,并开始使用ObsoleteAttribute将它们标记为过时,以便它们将停止使用.使用具有使用Obsolete属性标记的类型的KnownType属性并导致编译器警告的事实是预期的.但是,在我们的项目中,我们将警告视为错误,因此忽略警告不是一种选择.是否有编译器指令来抑制此警告?
以下用法会导致编译器警告:
///ProductTemplateDataSet is marked with the Obsolete attribute
[KnownType(typeof(ProductTemplateDataSet))]
public class EntityCollectionBase : System.Data.DataSet
{
}
Run Code Online (Sandbox Code Playgroud)
编辑:我理解使用编译器指令来忽略错误,但是这个编译器警告没有数字.
我正在尝试将一些常量添加到我的数据库中:
context.Stages.AddOrUpdate(s => s.Name,
new Stage()
{
Name = "Seven",
Span = new TimeSpan(2, 0, 0),
StageId = 7
});
context.Stages.AddOrUpdate(s => s.Name,
new Stage()
{
Name = "Eight",
Span = new TimeSpan(1, 0, 0, 0),
StageId = 8
});
Run Code Online (Sandbox Code Playgroud)
这是我的用于EF Codefirst Migrations的Seed()函数.它在第八阶段失败,具体如下:
System.Data.UpdateException:更新条目时发生错误.有关详细信息,请参阅内部异常 ---> System.OverflowException:SqlDbType.Time溢出.值'1.00:00:00'超出范围.必须在00:00:00.0000000和23:59:59.9999999之间.
为什么我无法使用EF存储时间跨度?我真的希望我不需要在这两端做一些愚蠢的时间转换...
我正在使用Microsoft TFS API,其中一个接口上的某个属性已标记为已过时,它指示我使用其他属性.不幸的是,API要我使用的属性由TFS2010而不是TFS2008使用.
我试过这样做:
#pragma warning disable 0612, 0618
request.CommandLineArguments = arguments;
#pragma warning restore 0612, 0618
Run Code Online (Sandbox Code Playgroud)
但我仍然得到CommandLineArguments已经过时的错误.反正有压制这个吗?
编辑
不幸的是,这并没有显示为"警告错误",实际上在我的项目中关闭了警告错误.以下是违规代码的屏幕上限以及错误列表

编辑2:
使用ILSpy后,CommandLineArguments属性在TFS2010 API中如下所示:
[Obsolete("This property has been deprecated. Please remove all references. To pass command line arguments to MSBuild.exe, set the ProcessParameters property.", true)]
string CommandLineArguments
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我认为没有办法告诉编译器忽略Obsolete属性导致的错误.
编辑3正如@Peter Ritchie指出的那样,这个值可以通过反射来设定.我想通过这个问题虽然我的猜测是,如果微软将属性设置为抛出异常,即使你通过反射设置它,我怀疑该值会被引用到任何地方.
我用:
[Obsolete("Use AnotherMethod() insted.", false)]
Run Code Online (Sandbox Code Playgroud)
第二个参数是false但Visual Studio为每个过时的方法调用显示警告为错误,以防止编译项目.如何让VS将这些调用标记为警告而不是错误?
我有一个类,我需要为遗留代码保留一个成员,我需要将其标记为过时,以便新代码不使用它(不会收到警告).
让我们说这个类看起来像这样:
class MyClass
{
[Obsolete]
private string _old = "...";
[Obsolete]
public string Old
{
get { return _old; }
}
}
Run Code Online (Sandbox Code Playgroud)
我声明成员字段_old已过时,以确保类中的新代码不使用该字段.
我还声明该属性Old已过时,以确保该类外的代码不使用该属性.
当我编译它时,我在属性getter中得到一个警告,说它_old已经过时了.我认为编译器会默默地忽略它,因为属性本身已经过时了.
我是否遗漏了某些东西,或者我是否需要#pragma warning disable/restore在其使用的任何地方添加过时的成员字段(即使方法/属性本身被标记为过时)?
" 我认为编译器会默默地忽略它 "的原因是因为它似乎对过时的类这样做:
[Obsolete]
public class MyObsoleteClass
{
public string DoSomething()
{
// No warning here, since the class itself is obsolete
return new MyClass().Old;
}
}
Run Code Online (Sandbox Code Playgroud)
正如@Heinzi所回答:这似乎是由于Visual Studio中的一个错误.我已经提交了关于连接的报告:
https://connect.microsoft.com/VisualStudio/feedback/details/1146809
事实证明,Visual Studio中的错误不仅限于从属性访问过时的字段.
从过时的方法访问过时的属性不应该产生警告:
public class Class2
{
[Obsolete]
public …Run Code Online (Sandbox Code Playgroud) 我有一些生成的代码有很多编译器警告。我想在生成的文件中禁用它们,但将这些警告保留在项目的其余部分中,以便可以修复它们。我使用的是 Visual Studio 2019 Community Edition,生成的文件来自实体框架和其他 NuGet 包。
我想在不更改文件的情况下执行此操作,因此如果重新生成它们,我将不会收到警告。我也不想在项目范围内禁用警告,因为它们通常是有用的警告。我也不想编辑 NuGet 包,因为这要么需要在有新版本可用时不升级它们,要么可能必须对新版本进行更改。
我已经读了很多书,但显然发布链接“太多”,所以我删除了它们。如果您想查看它们,请查看编辑历史记录。
有问题的文件是Reference.cs连接服务的文件。它的命名空间为Proxy.ProvisioningService,并且这个文件包含几十个类。我还有几个实体框架迁移文件,它们在完全不同的解决方案中存在相同的问题。
我有一个 GlobalSuppressions.cs 文件,我想将 CS1591 (专门)添加到其中,但我当前的条目不起作用。其他条目适用于其他警告,我已经尝试了以下代码的变体来工作,包括尝试匹配其他条目的格式,但到目前为止没有任何效果。我已经将“Build”从“Compile”更改为“Build”,删除了MessageId,更改Scope为“module”,“Assembly”和“namespaceanddescendants”,并且我尝试了几种不同的方法来设置Target.
[assembly: SuppressMessage("Build", "CS1591:Missing XML comment for publicly visible type or member", Justification = "Generated code", MessageId = "CS1591", Scope = "namespaceanddescendants", Target = "Proxy.ProvisioningService")]
Run Code Online (Sandbox Code Playgroud)
在其中一个场外链接中,它建议我右键单击该错误,转到Suppress -> In Suppression File,但这不是列出的选项。这是我无法在GlobalSuppressions.cs文件中执行此操作的线索吗?
我尝试让 Visual Studio 2019 Community Edition 自动抑制菜单项发出的警告Analyze -> Build And Suppress Active Issues -> For Project,但这只是向文件添加了一堆#pragma …