当前位置: 首页 > 知识库问答 >
问题:

为什么我可以传递1作为短变量,而不是int变量I?

邵兴怀
2023-03-14

为什么第一个和第二个写工作,但不是最后一个?有没有办法我可以允许所有3个,并检测它是1,(int)1还是i传入?为什么只允许一个,而允许最后一个?第二个被允许,但不是最后一个,真的让我大吃一惊。

演示显示编译错误

using System;
class Program
{
    public static void Write(short v) { }
    static void Main(string[] args)
    {
        Write(1);//ok
        Write((int)1);//ok
        int i=1;
        Write(i);//error!?
    }
}

共有3个答案

尚安平
2023-03-14

int可以隐式转换为short。鉴于:

不能将存储容量较大的非文字数字类型隐式转换为short

因此,前两个可以工作,因为允许对文本进行隐式转换。

李新霁
2023-03-14

由于截断的可能性,没有从int的隐式转换。但是,编译器可以将常量表达式视为目标类型。

1?没问题:这显然是一个有效的short值<代码>i?没有那么多——

韦俊英
2023-03-14

前两个是常量表达式,最后一个不是。

C#规范允许从int隐式转换为常量的缩写,但不允许其他表达式。这是一条合理的规则,因为对于常量,编译器可以确保值符合目标类型,但对于普通表达式则不行。

这条规则符合隐式转换应该是无损的准则。

6.1.8隐式常量表达式转换

隐式常量表达式转换允许以下转换:

  • 类型int的常量表达式(§7.18)可以转换为类型sbytebyteushortuintulong,前提是常量表达式的值在目标类型的范围内。
  • long类型的常量表达式可以转换为ulong类型,前提是常量表达式的值不是负数。

(引自C#语言规范3.0版)

 类似资料:
  • 问题内容: 例如,如果我有一个变量,并且在主线程中声明了一个runnable,并且想将x传递给该runnable的方法,则必须对其进行声明。为什么? 问题答案: 因为如果能够更改它们,可能会导致很多问题,请考虑以下事项: 这是一个粗略的示例,但您可以看到可能发生许多无法解释的错误。这就是变量必须为最终变量的原因。这是解决上述问题的简单方法: 如果您需要更完整的说明,则有点像同步。Java希望防止您

  • 问题内容: 我继承了一些Python代码,这些代码用于创建巨大的表(最多19列,每行5000行)。花了 九秒钟 时间在屏幕上绘制了表格。我注意到每一行都是使用以下代码添加的: 字符串在哪里。 我将其更改为: 我注意到桌子现在出现了 六秒 。 然后我将其更改为: 基于这些Python性能提示(仍为6秒)。 由于调用了大约5000次,因此突出了性能问题。但是为什么会有如此大的差异呢?为什么编译器没有在

  • 问题内容: 为什么此代码无法编译? 为什么我不能将类变量传递给? 问题答案: 该操作符对引用类型,像,而不是对象,如。您可能想要类似 旁注:如果编写,您的代码将更加简洁 但是,我不确定是否需要某种方法。

  • 我在表单中有一个按钮类型为button,带有方法post和submit按钮。我想在点击按钮(不提交)后将用户名输入值传递给php,但它不起作用。问题是什么?请帮助 注意:input username获取一个值按钮retrieveQ被单击并调用用head编写的post方法,然后在最后调用php中的getQuestion,用户的值通过数据库被回送到另一个文本框的innerhtml中 数据库和一切正常我

  • 问题内容: 我读了这个问题不可变对象,并留下了关于不可变对象,并最终场一个问题: 为什么我们需要不可变类中的实例变量为最终变量? 例如,考虑以下不可变的类: 如果在上面的代码中没有set方法,而实例变量仅在构造函数中设置,为什么要求将实例变量声明为final? 问题答案: 有没有 要求 这样做的变量。但是,当您确实明确打算永远不更改变量时,通常这样做是一种好习惯,因为这不仅可以使变量避免错别字或其

  • 问题内容: 当我看到以下代码无法按预期工作时,我有些困惑。 我认为Java总是通过引用将变量传递给函数。因此,为什么函数不能重新分配变量? 该程序输出。 问题答案: 对对象的引用是通过Java中的 值 传递的,因此在方法内部分配给局部变量不会更改原始变量。仅局部变量指向新字符串。稍微了解一下ASCII艺术可能会更容易理解。 最初,您有: 首次输入方法setNotNull时,您 将在中 获得null