C#学习1:C#初打仗,一些根本内容备忘和相干报错阐明

[复制链接]
发表于 2025-11-19 06:15:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
1 C#根本语法格式
1.1 根本规则
1.2 以if为例子
2 一些写法
2.1 时间相干
2.2 对数写法
2.3 关于使用random
2.4 UnityEngine.Random.value
2.5 PerlinNoise  函数
PerlinNoise 函数自己的输出范围

3 各种报错
3.0 unity里对C#报错内容超等具体
3.1 error cs1001; identifier expected
3.2 error CS0103: The name 'Math' does not exist in the current context
3.3 error CS0266: Cannot implicitly convert type 'double' to 'float'. An explicit conversion exists (are you missing a cast?)
3.4 error CS0103: The name 'jointRecoil' does not exist in the current context
3.5 error CS1503: Argument 1: cannot convert from 'double' to 'float
3.6 error CS0103: The name 'someMethod' does not exist in the current context
3.7 error CS0117: 'Math' does not contain a definition for 'Norm'
3.8 error CS0246: The type or namespace name 'NextDouble' could not be found (are you missing a using directive or an assembly reference?)
3.9  随机相干的报错
error CS0104: 'Random' is an ambiguous reference between 'UnityEngine.Random' and 'System.Random'
3.10 error CS0029: Cannot implicitly convert type '(double newX1, double newY1)' to 'UnityEngine.Vector2'



1 C#根本语法格式

1.1 根本规则



  • 巨细写敏感
  • 语句末了都要加 ;
  • 函数等block内容 须要{}括号
  • 定名只能以字母或下划线开头
  • 表明语句 //   /* */
  • 强范例语言,每个变量,表达式,编译时必须先声明,明确的范例
  • 引用包,using System;  对比python用的是 import numpy

1.2 以if为例子

   if ()
  {
   语句;
  }
  else if ()
  {
   语句;
  }
  else
  {
   语句;
  }
  

2 一些写法

2.1 时间相干

Time.deltaTime 在 Unity 游戏开发中是一个非常告急的属性,它体现从上一帧到当前帧的时间隔断。其单元是秒,但是在 Unity 内部,它被处置惩罚成了浮点数,以是它并不是准确到毫秒。
Time.deltaTime 的重要用途是用于盘算每帧应该移动多远,大概是盘算动画应该播放多少。假如你在更新函数(如 Update() 或 FixedUpdate())中使用 Time.deltaTime,它可以确保纵然目标平台的性能差别巨大,你的游戏动画和物理更新仍旧能正常运行。


2.2 对数写法



  • 天然对数,
  • double naturalLog = Math.Log(number);
  • // 盘算以10为底的对数
  • double log10 = Math.Log10(number)
有些其他地方写法是 log(number, e) log(number, 10) 如许的


2.3 关于使用random

   

  • using System;
  • Random random = new Random();
  • int randomInt = random.Next(0, int.MaxValue);


2.4 UnityEngine.Random.value

UnityEngine.Random.value 返回[0,1] 
编程小知识之 Random接口返回值_unityengine.random.value-CSDN博客文章欣赏阅读1k次。本文简述了 Random 接口返回值的一些相干信息通常工作中,(伪)随机数的使用肯定是避不开的,拿 C# 为例,System 定名空间下的 Random 范例一样平常都是我们天生(伪)随机数的第一选择:var rand = new System.Random();var val = rand.NextDouble();Unity 中也在 UnityEngine 定名空间下提供了自己的 R..._unityengine.random.value


2.5 PerlinNoise  函数

PerlinNoise 函数自己的输出范围

在 Unity 中, Mathf.PerlinNoise 函数的返回值范围是在 [0, 1] 区间内。也就是说,对于单独调用 Mathf.PerlinNoise(x, y) (此中 x 和 y 为传入的坐标参数),它返回的结果最小是 0 ,最大是 1
   v1= new Vector2( Mathf.PerlinNoise(Time.time * 2, 0f) - 0.5f,Mathf.PerlinNoise(0f, Time.time * 2) - 0.5f ) * (2f * 0.1);
  
  

  • 原始 Perlin 噪声值范围:Mathf.PerlinNoise [0, 1] 
  • 减去 0.5 后范围:[-0.5, 0.5]
  • 乘以 0.2 后范围:[-0.1, 0.1]


3 各种报错

3.0 unity里对C#报错内容超等具体


   unity里,会自动报错,很好用
  好比 cross.cs(28,19):error cs1001; identifier expected
  体现 
  

  • cross.cs 文件的
  • (line 28,19字符) 报错,
  • 错误范例cs1001
  • 错误内容 ; identifier expected

3.1 error cs1001; identifier expected



  • ; identifier expected 体现,渴望/须要这有;但是现实缺少标识符
  • 一样平常是;
  • int = 10; // 这里缺少了变量名
  • Object obj = new(); // 这里缺少类名

3.2 error CS0103: The name 'Math' does not exist in the current context



  • 很多方法,都须要引用math下的方法,好比math.sin()
  • 但是,使用math包,和python一样,须要先导入
  • C#须要文件开头加一句,using System;


3.3 error CS0266: Cannot implicitly convert type 'double' to 'float'. An explicit conversion exists (are you missing a cast?)


error CS0266: Cannot implicitly convert type 'double' to 'float'. An explicit conversion exists (are you missing a cast?)

报错表明:
错误 CS0266 体现不能隐式地将 double 范例转换为 float 范例。由于 double 范例具有比 float 更大的有用数字范围和精度,因此不能直接将 double 值赋给须要 float 范例的变量。
办理方法:
使用显式转换:通过使用逼迫转换使用符将 double 值转换为 float 范例。比方,假如有一个 double 变量 d,你可以通过 (float)d 来得到它的 float 近似值。

   double x = 123.456;
float f = (float) x;
  由于C# 是严格声明的,强范例的语言
  有些地方要求是 double范例的,但是在其他一些地方须要用float,以是须要转换,不能直接用
  为什么不能直接用,好比 double 直接当成float 会丢失部分数据的
  
  
C# 错误 CS0266 体现你正在实行将 double(双精度浮点数)赋值给 float(单精度浮点数)变量,而没有举行显式转换。这是由于 double 的精度(64 位)高于 float(32 位),从高精度范例隐式转换为低精度范例大概会导致数据丢失。
以下是修复此标题的方法,以及阐明和最佳实践:
1. 显式转换:
最常见和最直接的办理方案是使用显式转换:


3.4 error CS0103: The name 'jointRecoil' does not exist in the current context



  • error CS0103: The name 'jointRecoil' does not exist in the current context
  • 报错表明:
    错误 CS0103 体现名为 'jointRecoil' 的标识符在当前上下文中不存在。这通常意味着你在代码中引用了一个变量、方法或范例,但是在你的当前作用域大概当前的定名空间中,编译器找不到这个名称的界说。
  • 变量 jointRecoil 没有先声明范例就直接使用了!不可,必须先声明范例

3.5 error CS1503: Argument 1: cannot convert from 'double' to 'float

error CS1503: Argument 1: cannot convert from 'double' to 'float
报错表明:
错误 CS1503 体现方法调用的参数范例不匹配。具体来说,是指方法渴望的是一个 float 范例的参数,但是你提供的是一个 double 范例的参数。
须要转换数值范例

3.6 error CS0103: The name 'someMethod' does not exist in the current context

error CS0103: The name 'someMethod' does not exist in the current context
使用的 someMethod 这个方法,并没有先在代码中实现


3.7 error CS0117: 'Math' does not contain a definition for 'Norm'

error CS0117: 'Math' does not contain a definition for 'Norm'
C# 里并没有默认的 Math.norm()  天生正态分布的方法

错误表明:
错误 CS0117 体现您实行调用的 Math 类中不存在名为 Norm 的方法或界说。这通常意味着您正在实行使用不存在的成员来实行使用。


3.8 error CS0246: The type or namespace name 'NextDouble' could not be found (are you missing a using directive or an assembly reference?)

error CS0246: The type or namespace name 'NextDouble' could not be found (are you missing a using directive or an assembly reference?)

错误表明:
错误 CS0246 体现编译器无法在当前上下文中找到名为 'NextDouble' 的范例或定名空间。这通常意味着 'NextDouble' 没有准确引用或界说。
就是没有先辈行声明,确定明确的范例
办理方法:
确保您已经引用了包罗 'NextDouble' 方法的定名空间。对于 .NET 中的随机数天生,您须要引用 System 定名空间,由于 NextDouble 方法界说在 System 定名空间下的 Random 类中。

3.9  随机相干的报错

error CS0104: 'Random' is an ambiguous reference between 'UnityEngine.Random' and 'System.Random'

错误 CS0104:“Random”是不明确的引用,存在于“UnityEngine.Random”和“System.Random”之间。
这个错误通常发生在 Unity (一个游戏开发引擎) 中,由于 UnityEngine 和 System 定名空间都包罗一个名为 Random 的类。当你在代码中只使用 Random 时,编译器不知道你指的是哪一个。
以下是几种办理方法:
1. 明确指定定名空间(保举):
最常见也是最保举的办理方案是在声明或使用 Random 类时指定完备的定名空间

   UnityEngine.Random.Range(0, 10); // 天生一个介于 0(包罗)和 10(不包罗)之间的随机整数
float randomFloat = UnityEngine.Random.value; // 天生一个介于 0.0f 和 1.0f(包罗)之间的随机浮点数
  

3.10 error CS0029: Cannot implicitly convert type '(double newX1, double newY1)' to 'UnityEngine.Vector2'

错误 CS0029:“无法将范例‘(double newX1, double newY1)’隐式转换为‘UnityEngine.Vector2’”体现你正实行将范例为 (double newX1, double newY1)(一个包罗两个 double 值的元组)的值直接赋给范例为 UnityEngine.Vector2 的变量。C# 不会自动将元组转换为 Vector2。
以下是怎样修复此标题以及每种办理方案的原理:
1. 显式创建 Vector2:
这是最常见和保举的办理方案。使用元组的值作为 x 和 y 分量创建一个新的 Vector2 对象。

   using UnityEngine;
  // ... 其他代码 ... (double newX1, double newY1) myTuple = (5.0, 3.2); // 示例元组
  
  Vector2 myVector = new Vector2((float)myTuple.newX1, (float)myTuple.newY1);
  // 大概使用解构语法,更简便
  
  (C# 7.0 及更高版本):
  (double x, double y) = myTuple; Vector2 myVector2 = new Vector2((float)x, (float)y);
  
           spearRadius=0.1*Math.Log(bulletsNumInCd*5);
  
          double randomFloat = UnityEngine.Random.value;
  
          angle1 = UnityEngine.Random.value * 360 ;
          radius1 =UnityEngine.Random.value * spearRadius ;
          newX1=radius1* Math.Cos(angle1*Math.PI/180);
          newY1=radius1* Math.Sin(angle1*Math.PI/180);
          //newPos1 = newX1 , newY1 ;
          Vector2 newPos1 = new Vector2((float)newX1, (float)newY1);
  
不能这么写
newPos1 = (newX1, newY1);
newPos1 = ((float)newX1, (float)newY1);

必须用下面这种布局体才华天生
Vector2 newPos1 = new Vector2((float)newX1, (float)newY1);
最常见的错误是实行用逗号来创建一个类似“元组”的东西。C# 中没有内置的用逗号直接创建坐标或点的语法。你须要使用符合的范例,比方 Point、PointF、Vector2 或自界说的布局体。
根据你的项目范例和需求选择符合的方法。假如是在 Windows 窗体或 WPF 应用步伐中处置惩罚图形,Point 或 PointF 通常就富足了。假如须要向量运算,则使用 Vector2。假如须要更复杂的体现,则创建自界说的布局体。
请记着举行须要的范例转换,由于 Math.Cos 和 Math.Sin 返回 double,而 Point 使用 int,PointF 和 Vector2 使用 float。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表