0

我必须在我的 C# 程序中添加一些外部 C 代码,即来自 gettext PO 文件的复数计算:例如

nplurals=2; plural=(n != 1);

或者

nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;

要使用这些,我必须定义n和。 并且是简单的整数,不是问题;但是,当我定义以及将其定义为.npluralspluralnnpluralsint pluralbool plural

原因很明显:C 不知道真正的布尔值——在 C 中,所有布尔值都是整数,您可以对它们进行数值和逻辑运算。C# 中的布尔值处理是不同的——你不能像&&整数一样进行逻辑运算,也不能对布尔值进行数值运算。

有没有办法在不改变它们的情况下使用这些功能?

4

1 回答 1

1

是的,这很简单。定义一个模仿 C 布尔处理的结构:

public struct CBool
{
    private int m_value;
    public static implicit operator bool(CBool cb) => cb.m_value != 0;
    public static implicit operator int(CBool cb) => cb.m_value;
    public static implicit operator CBool(int val) => new CBool(val);
    public static implicit operator CBool(bool val) => new CBool(val);
    public CBool(int val = 0) { m_value = val; }
    public CBool(bool val) { m_value = val ? 1 : 0; }
}
...
CBool plural;

此结构的行为类似于 C“布尔” - 您可以使用它进行数值和逻辑运算,例如plural = trueorplural = 7 但是,由于它与通常的 C# 规则相矛盾并且在性能方面存在问题,因此它应该仅用于上述特殊情况。对于常见的 int/bool 转换,Convert应使用常用方法。

于 2020-12-21T14:23:03.217 回答