* .xaml.g.cs文件显示过时的警告(CS0618)。如何在部分类中使用过时属性?

时间:2019-12-12 13:07:57

标签: xaml xamarin obsolete

我有一个标记为已过时的自定义视图

[Obsolete("AccordionButton is deprecated, please use HeaderButton instead.")]

通过将此属性添加到* .xaml.cs文件中。现在,我在编译时的 xaml.g.cs 文件中收到警告,因为它是局部类(由文件后面的* .xaml和* .xaml.cs代码组成)。

我不明白为什么收到警告,该视图未在其他任何地方使用。是的,我可以删除该文件,但是出于好奇,他为什么不检查这是否是局部类?如何摆脱警告并同时保留Obsolete属性?

编辑:

这是“完整”代码:

AccordionButton.xaml.cs

using MyProject.Common.CustomRenderers;
using System;
using Xamarin.Forms;

namespace MyProject.Views
{
#pragma warning disable 618
    [Obsolete("AccordionButton is deprecated, please use HeaderButton instead.")]
    public partial class AccordionButton : MultiLineButton
    {
        private bool expand = false;

        public bool Expand
        { 
            get{ return this.expand;}
            set{ this.expand = value;}
        }

        public ContentView AssociatedContent { get; set; }

        public AccordionButton()
        {

        }
    }
#pragma warning restore 618
}

AccordionButton.xaml

<?xml version="1.0" encoding="utf-8" ?>
<customViews:MultiLineButton xmlns="http://xamarin.com/schemas/2014/forms"
                         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                         x:Class="MyProject.Views.AccordionButton"
                         xmlns:customViews="clr-namespace:MyProject.Views;assembly=MyProject">

</customViews:MultiLineButton>

AccordionButton.xaml.g.cs

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

[assembly: global::Xamarin.Forms.Xaml.XamlResourceIdAttribute("MyProject.Views.AccordionButton.xaml", "Views/AccordionButton.xaml", typeof(global::MyProject.Views.AccordionButton))]

namespace MyProject.Views {


    [global::Xamarin.Forms.Xaml.XamlFilePathAttribute("Views\\AccordionButton.xaml")]
    public partial class AccordionButton : global::MyProject.Views.MultiLineButton {

        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Forms.Build.Tasks.XamlG", "0.0.0.0")]
        private void InitializeComponent() {
            global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(AccordionButton));
        }
    }
}

如果我双击警告,他将标记此部分global::MyProject.Views.AccordionButton。该警告仅在编译后出现...

当我将其与测试项目(一切正常)进行比较时, AccordionButton.xaml.g.cs 看起来像这样

[assembly: global::Xamarin.Forms.Xaml.XamlResourceIdAttribute("TestObsolete.Views.AccordionButton.xaml", "Views/AccordionButton.xaml", null)]

所以我的项目中有一些不同之处,但是我还没有弄清楚什么以及为什么。

1 个答案:

答案 0 :(得分:1)

Obsolete attribute将程序实体标记为不再建议使用。每次使用标记为过时的实体,都会根据属性的配置方式而产生警告或错误。

1。将过时的类设置为

[Obsolete("AccordionButton is deprecated, please use HeaderButton instead.")]
public partial class Page1 : ContentView
{
    public Page1()
    {
        InitializeComponent();

        Page2 page2 = new Page2();
        page2.method();
    }
}

enter image description here

2。在方法上设置过时。

[Obsolete("AccordionButton is deprecated, please use HeaderButton instead.")]
public partial class Page1 : ContentView
{
    public Page1()
    {
        InitializeComponent();

        Page2 page2 = new Page2();
        page2.method();
    }
}
public partial class Page2
{
    [Obsolete("AccordionButton is deprecated, please use HeaderButton instead.",true)]
    public void method()
    {
        Console.Write("a");
    }
}

使用IsError属性设置已过时。 IsError是一个布尔值,向编译器指示使用ObsoleteAttribute属性应该导致它发出错误(IsError为true)还是警告(IsError为false)。

enter image description here

如果您想在没有警告的情况下使用过时,可以尝试以下方法。

1。忽略文件错误

`#pragma warning disable 618`

        Page2 page2 = new Page2();
        page2.method1();

2。忽略项目中的错误

enter image description here 有关禁用警告的更多信息,可以检查链接。 https://stackoverflow.com/a/40525222/11850033

已更新:

  

感谢您的回复!您在这里写了一个不错的摘要。我尝试使用#pragma warning disable和#pragma warning restore,但应将其放置在什么位置以免收到警告?我将编辑问题,以便您查看。我仍然不明白的是为什么会发生此错误。 Xaml使用分部类(因此它正在使用自身),是否足以引起警告?

#pragma warning可以启用或禁用某些警告。

用法:

#pragma warning disable warning-list
#pragma warning restore warning-list

warning-list: 以逗号分隔的警告编号列表。 “ CS”前缀是可选的。

如果未指定警告编号,则禁用将禁用所有警告,而还原将启用所有警告。

根据您的代码,可以在使用如下所示的过时类之前将其放入。

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        #pragma warning disable
        AccordionButton accordionButton = new AccordionButton();
        var s = accordionButton.Expand;
    }
}
  

要清楚:当另一个View使用此组件(AccordionButton)时,应该引发警告。如果xaml和文件后面的代码“一起工作”,则不应该显示。

当另一个视图使用此类时,也会抛出该错误。

enter image description here