如何解决如何在 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;
要使用这些,我必须定义 n
、nplurals
和 plural
。
n
和 nplurals
是简单的整数,不是问题;但是,当我定义 int plural
以及将其定义为 bool plural
时,总是会出现编译器错误。
原因很明显:C 不知道真正的 bool - 在 C 中所有 bool 都是整数,您可以对它们进行数值和逻辑运算。 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 = true
或 plural = 7
但是,由于它与通常的 C# 规则相矛盾并且在性能方面存在问题,因此它应该仅用于上述特殊情况。对于常见的 int/bool 转换,应使用通常的 Convert
方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。