If statement 检查枚举类的类型

If statement 检查枚举类的类型,if-statement,ceylon,If Statement,Ceylon,我有一个枚举的抽象类: shared abstract class Foo() of bar|baz {} 以及尝试检查Foo是否不是条的函数: shared void test(Foo foo) { if (!is bar foo) { } } 我得到了错误 incorrect syntax: no viable alternative at token 'bar' 因为bar是一个枚举实例,所以它只是一个值,而不是一个类型。但是它确实有一个比Foo更具体的类型,您可以

我有一个枚举的抽象类:

shared abstract class Foo() of bar|baz {}
以及尝试检查
Foo
是否不是
条的函数:

shared void test(Foo foo) {
    if (!is bar foo) {

    }
}
我得到了错误

incorrect syntax: no viable alternative at token 'bar'

因为
bar
是一个枚举实例,所以它只是一个值,而不是一个类型。但是它确实有一个比
Foo
更具体的类型,您可以通过在它前面加
\I
来表示它

void test(Foo foo) {
    if (!is \Ibar foo) {
        print("Not bar!");
    }
}

因为
bar
是一个枚举实例,所以它只是一个值,而不是一个类型。但是它确实有一个比
Foo
更具体的类型,您可以通过在它前面加
\I
来表示它

void test(Foo foo) {
    if (!is \Ibar foo) {
        print("Not bar!");
    }
}

@gdejohn的回答是正确的,但我还要指出,直接引用枚举实例的类型通常没有多大意义。通常您会这样编写代码:

void test(Foo foo) {
    if (foo!=bar) {
        print("Not bar!");
    }
}

@gdejohn的回答是正确的,但我还要指出,直接引用枚举实例的类型通常没有多大意义。通常您会这样编写代码:

void test(Foo foo) {
    if (foo!=bar) {
        print("Not bar!");
    }
}

同意你通常不想缩小字体。如果
bar
baz
声明了您想要使用的新属性或方法,那么这样做是有意义的。还有一个更有趣的用例:您想要将选项集缩小到实例的子集,例如,类似于:
\Ioption1 |\Ioption4 |\Ioption5
的类型。同意您通常不想缩小类型。如果
bar
baz
声明了您想要使用的新属性或方法,那么这样做是有意义的。还有一个更有趣的用例:您想要将选项集缩小到实例的子集,例如,类似于:
\Ioption1\Ioption4\Ioption5
的类型。