如何在C#中使用gettext复数定义函数



我必须在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;

要使用这些,我必须定义nnpluralsplural。CCD_ 6和CCD_;然而,当我将int plural定义为bool plural时,我总是会遇到编译器错误。

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

然而,有没有一种方法可以在不更改这些函数的情况下使用这些函数?

是的,它非常简单。定义一个模仿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";bool"-您可以像plural = trueplural = 7那样使用它进行数字运算和逻辑运算然而,由于它与通常的C#规则相矛盾,并且在性能方面值得怀疑,因此它应该只用于前面提到的特殊情况。对于常见的int/bool转换,应使用常见的Convert方法。

最新更新