小编Nic*_*Eye的帖子

在特殊情况下如何禁用Android @IntDef注释检查?

其中一种情况是从Bundle中读取一个int并将其存储到由@IndDef注释限制的变量中:

public class MainActivity extends ActionBarActivity {

@IntDef({STATE_IDLE, STATE_PLAYING, STATE_RECORDING})
@Retention(RetentionPolicy.SOURCE)
public @interface State {}

public static final int STATE_IDLE = 0;
public static final int STATE_PLAYING = 1;
public static final int STATE_RECORDING = 2;

@MainActivity.State int fPlayerState = STATE_IDLE;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null)
        fPlayerState = savedInstanceState.getInt(BUNDLE_STATE); //Causes "Must be one of: ..." error
Run Code Online (Sandbox Code Playgroud)

必须有某种方法可以抑制检查或从int转换为@ MainActivity.State int,以便在最后一行设置变量.

另一种情况是编写一个负面测试,调用带有注释参数的函数故意传递错误的参数,以便测试在这种情况下抛出异常.必须有一种方法来抑制注释检查以编译这样的测试.

android annotations casting suppress android-support-library

26
推荐指数
2
解决办法
6307
查看次数

为什么方法组允许在'is'运算符的左侧,如何在实践中使用它?

首先,"方法组是由成员查找产生的一组重载方法".在我的例子中,我使用了Console.WriteLine19个重载的方法集.

C#语言规范中方法组的定义还指出:"在调用表达式(第7.6.5节)中允许使用方法组,在委托创建表达式(第7.6.10.5节)中使用方法组,并在左侧使用是一个运算符,可以隐式转换为兼容的委托类型(第6.6节)."

我可以想到这个功能可能有用的一个场景:

Action<string> print = (Action<string>)Console.WriteLine;
print("Hello!");

if (Console.WriteLine is Action<string>) 
{
    Console.WriteLine("We're compatible!");
}
Run Code Online (Sandbox Code Playgroud)

前几行显示我们可以将方法组" Console.WriteLine转换"为委托.实际发生的是"转换为兼容委托类型的隐式转换",它创建委托实例,调用Console.WriteLine具有兼容签名的许多重载方法之一.

因此,根据规范,我们可以使用上面提到的"运算符的左侧"功能来测试方法组是否与给定的委托类型兼容(存在隐式转换).这是在示例代码中的'if'语句中检查的内容.

令人惊讶的是,代码编译,但发出警告"给定的表达式永远不会提供('System.Action')类型".因此,似乎不会尝试在运行时检查方法组和委托类型的兼容性.

因此,我的问题:

  • 如果在运行时无法执行检查,为什么在'is'运算符的左侧允许方法组?
  • 为什么这个构造会发出警告而不是编译错误?
  • 是否有任何在'is'运算符左侧使用方法组的实际场景?
  • 这是为未来的用途保留的东西,即设想上面的代码将在某一天工作吗?

c# methods delegates

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