相关疑难解决方法(0)

如何在与Knowntype属性一起使用的类上使用Obsolete属性时忽略编译器警告

因此,我们尝试弃用一些现有的类,并开始使用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)

编辑:我理解使用编译器指令来忽略错误,但是这个编译器警告没有数字.

.net c# attributes compiler-warnings

53
推荐指数
3
解决办法
4万
查看次数

使用实体框架Codefirst存储TimeSpan - SqlDbType.Time溢出

我正在尝试将一些常量添加到我的数据库中:

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存储时间跨度?我真的希望我不需要在这两端做一些愚蠢的时间转换...

.net c# entity-framework ef-code-first

24
推荐指数
4
解决办法
2万
查看次数

在C#中禁用OBSOLETE错误

我正在使用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指出的那样,这个值可以通过反射来设定.我想通过这个问题虽然我的猜测是,如果微软将属性设置为抛出异常,即使你通过反射设置它,我怀疑该值会被引用到任何地方.

c#

13
推荐指数
3
解决办法
1万
查看次数

为什么过时会导致错误?

我用:

[Obsolete("Use AnotherMethod() insted.", false)]
Run Code Online (Sandbox Code Playgroud)

第二个参数是false但Visual Studio为每个过时的方法调用显示警告为错误,以防止编译项目.如何让VS将这些调用标记为警告而不是错误?

.net c# visual-studio-2010 visual-studio

8
推荐指数
1
解决办法
6178
查看次数

具有属性访问器的过时成员字段(Visual Studio错误)

我有一个类,我需要为遗留代码保留一个成员,我需要将其标记为过时,以便新代码不使用它(不会收到警告).

让我们说这个类看起来像这样:

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)

c# obsolete

5
推荐指数
1
解决办法
1227
查看次数

如何仅在生成的代码中禁用编译器警告而不编辑文件

我有一些生成的代码有很多编译器警告。我想在生成的文件中禁用它们,但将这些警告保留在项目的其余部分中,以便可以修复它们。我使用的是 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 …

c# suppress-warnings generated-code visual-studio-2019

5
推荐指数
2
解决办法
3201
查看次数