C#中的警告CS0120、CS0176、CS0183、CS0618、CS8600、CS8602、CS8604、CS8625及处理

目录

一、CS0120

二、CS0176

1.解决前

2.解决后

3.解决办法

三、CS0183

四、CS0618

五、CS8600

六、CS8602

七、CS8622

[1. 解决前:](#1. 解决前:)

[2. 解决后:](#2. 解决后:)

3.解决方法:

八、CS8604和CS8625


一、CS0120

|-----|--------|---------------------------------------------------------|------|----------------------------------------------|----|--------|
| 严重性 | 代码 | 说明 | 项目 | 文件 | 行 | 禁止显示状态 |
| 错误 | CS0120 | 对象引用对于非静态的字段、方法或属性"Program.CreateXmlFromDatabase()"是必需的 | 10_2 | E:\C#_TM\chapter15\10_2\10_2\Program.cs | 31 | 活动 |

cs 复制代码
static void Main(string[] args)
{
    CreateXmlFromDatabase();
}

解决办法有两种:

  • 将引用的方法new一个对象出来。
  • 将引用的方法改成static静态方法,或者引用对应版本的方法。

二、CS0176

|-----|--------|----------------------------------------------------------------|------|----------------------------------------|----|--------|
| 严重性 | 代码 | 说明 | 项目 | 文件 | 行 | 禁止显示状态 |
| 错误 | CS0176 | 无法使用实例引用来访问成员"Students.SubscribeToRing(SchoolRing)";请改用类型名来限定它 | 09_1 | E:\C#_TM\chapter17\09_1\Program.cs | 13 | 活动 |

1.解决前

cs 复制代码
static void Main(string[] args)
{
    SchoolRing sr = new();                       //创建学校铃声类的对象
    Students student = new();
    student.SubscribeToRing(sr);          		 //订阅铃声
    Console.Write("请输入打铃参数(1:表示打上课铃;2:表示打下课铃):");
    sr.Jow(Convert.ToInt32(Console.ReadLine())); //事件只能由发布者触发
    Console.ReadLine();
}

2.解决后

cs 复制代码
static void Main(string[] args)
{
    SchoolRing sr = new();                         //创建学校铃声类的对象
    Students.SubscribeToRing(sr);                  //订阅铃声
    Console.Write("请输入打铃参数(1:表示打上课铃;2:表示打下课铃):");
    sr.Jow(Convert.ToInt32(Console.ReadLine()));   //事件只能由发布者触发
    Console.ReadLine();
}

3.解决办法

用类代替实例,这个是静态方法,需要直接使用类名使用,无需创建实例。

三、CS0183

给定表达式始终为所提供的("类型")类型

如果条件语句的计算结果始终为 true,则不需要条件语句。 当尝试使用 is 运算符评估类型时,会出现此警告。 如果计算结果是值类型,则不需要进行检查。

is操作符只考虑引用转换、装箱转换和取消装箱转换。下面的程序都会发生编译时错误(CTE):已知表达式将始终是 true 或始终是 false。

cs 复制代码
int i = 0;                  //声明整型变量i
object obj = i;             //把值类型转换为引用类型,装箱操作解除CS0183
bool vi = obj is int;       //is只能用于引用转换、装箱转换和取消装箱转换
bool result = vi;          	//判断i是否为整型,警告IDE0150
Console.WriteLine(result);  //输出结果
Console.ReadLine();

解除办法:对is操作的变量进行装箱操作,然后is操作装箱后的变量。

四、CS0618

"string.Copy(string)"已过时:"This API should not be used to create mutable strings. See https://go.microsoft.com/fwlink/?linkid=2084035 for alternatives."

解除CS0618:在Main()方法前添加[Obsolete]。

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test15
{
    class Program
    {
        [Obsolete]                      //添加,以解除CS0618
        static void Main(string[] args)
        {
            if (args is null)           //解除IDE0060
            {
                throw new ArgumentNullException(nameof(args));
            }

            string stra = "AI时代";		//声明一个字符串变量stra并初始化
            string strb;				//声明一个字符串变量strb
            //使用String类的Copy方法,复制字符串stra并赋值给strb
            strb = String.Copy(stra);   //String.Copy(string)已过时,CS0618

            Console.WriteLine(strb);	//输出字符串strb
            Console.ReadLine();

        }
    }
}

五、CS8600

将 null 文字或可能的 null 值转换为不可为 null 的类型。

  • 用string?解除CS8600

string? name = Console.ReadLine(); //解除CS8600

  • 用??string.Empty解除CS8600

string str = Console.ReadLine() ?? string.Empty; //解除CS8600

  • 用var解除CS8600

var name = Console.ReadLine(); //解除CS8600

为了参考和进一步研究,您收到此错误是因为您在项目中启用了可为空的引用类型docs.microsoft.com/en-us/dotnet/csharp/nullable-references。 Console.ReadLine 返回一个可以为空的字符串 (string?),您尝试将其分配给一个不可为空的字符串变量。

六、CS8602

|-----|--------|-------------|------|----------------------------------------------------------|-----|--------|
| 严重性 | 代码 | 说明 | 项目 | 文件 | 行 | 禁止显示状态 |
| 警告 | CS8602 | 解引用可能出现空引用。 | 10_3 | C:\Users\YCZN_MT\Desktop\测试1\10_3\10_3\Program.cs | 118 | 活动 |

若要删除这些警告,需要在取消引用之前添加代码,将该变量的"null 状态"更改为"不为 null"。 集合初始值设定项警告可能更难以发现。 初始化表达式向集合添加元素时,编译器检测到该集合可能为 null。

cs 复制代码
void WriteMessageLength(string? message)
{
    if (message is not null)					    //if()解除CS8602
    {
        Console.WriteLine(message.Length);	        //CS8602
    }
}

void LogPerson(Person person) 
{ 
    Console.WriteLine(person.MiddleName.Length); 	//警告CS8602
    Console.WriteLine(person.MiddleName!.Length); 	//没有警告 
}

这个 ! 运算符其实就是关闭了编译器的空检查。

七、CS8622

|-----|--------|--------------------------------------------------------------------------------------------------------------------------|------|----------------------------------------|----|--------|
| 严重性 | 代码 | 说明 | 项目 | 文件 | 行 | 禁止显示状态 |
| 警告 | CS8622 | "void Students.SchoolJow(object sender, EventArgs e)"的参数"sender"类型中引用类型的为 Null 性与目标委托"EventHandler"不匹配(可能是由于为 Null 性特性)。 | 09_1 | E:\C#_TM\chapter17\09_1\Program.cs | 55 | 活动 |

1. 解决前:

cs 复制代码
public static void SchoolJow(object sender, EventArgs e)
{
    if (((RingEventArgs)e).RingKind == 2)          //打了下课铃
    {
        Console.WriteLine("同学们开始课间休息!");
    }
    else if (((RingEventArgs)e).RingKind == 1)     //打了上课铃
    {
        Console.WriteLine("同学们开始认真学习!");
    }
}

2. 解决后:

cs 复制代码
public static void SchoolJow(object? sender, EventArgs e)
{
    略
}

3.解决方法:

在提示里的object后面加一个?

八、CS8604和CS8625

cs 复制代码
"int int.Parse(string s)"中的形参"s"可能传入 null 引用实参。
用??string.Empty解除CS8604
int year = Int32.Parse(str?? string.Empty);				//解除CS8604
用if语句解除CS8604
string str = Console.ReadLine() ?? string.Empty;    	//获取用户输入的年份
if (str != null)                                		//解决CS8604
{
int year = Int32.Parse(str);     						//将输入的年份转换成int类型
//计算输入的年份是否为闰年
bool isleapyear = ((year % 400) == 0) || (((year % 4) == 0) && ((year % 100) != 0));
//利用条件运算符输入"是"或者"不是"
string yesno = isleapyear ? "是" : "不是";
Console.WriteLine("{0}年{1}闰年", year, yesno);			//输出结果
Console.ReadLine();
}
double d = double.Parse(Console.ReadLine() ?? string.Empty);//解除CS8604
或者在文件中增加#nullable disable也解除CS8604。
相关推荐
测试界的酸菜鱼几秒前
C# NUnit 框架:高效使用指南
开发语言·c#·log4j
GDAL几秒前
lua入门教程 :模块和包
开发语言·junit·lua
李老头探索2 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
CSXB993 分钟前
三十四、Python基础语法(文件操作-上)
开发语言·python·功能测试·测试工具
web Rookie23 分钟前
JS类型检测大全:从零基础到高级应用
开发语言·前端·javascript
工业甲酰苯胺34 分钟前
C# 单例模式的多种实现
javascript·单例模式·c#
很楠不爱34 分钟前
Qt——窗口
开发语言·qt
yi碗汤园34 分钟前
【一文了解】C#基础-集合
开发语言·前端·unity·c#
Cachel wood1 小时前
Github配置ssh key原理及操作步骤
运维·开发语言·数据库·windows·postgresql·ssh·github
დ旧言~1 小时前
【网络】应用层——HTTP协议
开发语言·网络·网络协议·http·php