这是我的第一篇文章,我期待加入这个社区。 p>
我最初遇到了代码编译问题。我有一个静态方法,它调用字典中的转换值。经过一些研究,我了解到不仅需要将方法声明为静态,还需要声明变量。
令我困惑的是,Pressur.Unit类型的枚举不需要声明为静态。我玩了一些其他的变量,比如double和int类型,似乎它们也必须被称为static才能在静态方法中使用。
任何人都可以向我解释一下enum类型有什么特别之处,它允许它在不被称为静态的情况下工作吗?实际上,当向声明添加static时,它也会产生编译错误。
这是我的代码的快照:
public class Pressure
{
public enum Unit
{
psi,
psf,
mPa,
Pa,
hPa,
kPa,
MPa,
mmH2O,
mH2O,
inH2O,
ftH2O,
mmHg,
inHg,
atm,
bar,
kgcm2
}
// Conversions for each unit to/from Pa
private static readonly Dictionary<Unit, double> conversions = new Dictionary<Unit, double>()
{
{ Unit.psi, 6894.76 },
{ Unit.psf, 47.9 },
{ Unit.mPa, 0.001 },
{ Unit.Pa, 1 },
{ Unit.hPa, 100 },
{ Unit.kPa, 1000 },
{ Unit.MPa, 1000000 },
{ Unit.mmH2O, 9.80665 },
{ Unit.mH2O, 980.665 },
{ Unit.inH2O, 248.84 },
{ Unit.ftH2O, 2986.08 },
{ Unit.mmHg, 133.322 },
{ Unit.inHg, 3386.39 },
{ Unit.atm, 101325 },
{ Unit.bar, 100 },
{ Unit.kgcm2, 98068}
};
/// <summary>
/// Converts pressure between engineering units.
/// </summary>
/// <param name="value">Pressure value</param>
/// <param name="unitIn">Pressure unit of input value</param>
/// <param name="unitOut">Pressure unit of returned value</param>
/// <returns>Pressure value in the output pressure unit.</returns>
public static double Convert(double value, Unit unitIn, Unit unitOut)
{
return value * conversions[unitIn] / conversions[unitOut];
}
}
我目前正在使用Visual Studio 14.0.25431.01 Update 3.
答案 0 :(得分:0)
没有问题,因为您永远不会访问Unit
类型的非静态成员。
您只访问枚举成员,在这种情况下,枚举成员与常量不同。
以这种方式考虑:
这是一个不同的类,可以更好地形象化:
class Person {
enum Gender {
Man, Woman, Thing
};
Gender gender;
string name;
}
您可以随时使用Gender.Man
和其他人,因为它只是一个定义,而不是Person
的成员或财产。
您可以随时询问&#34;什么是Man
?&#34;你知道答案,因为它只是一个定义。
但是现在试着询问&#34;什么是gender
?&#34;您无法在不知道哪个Person
的情况下回答这个问题,因为它是非静态成员变量。
答案 1 :(得分:0)
那是因为Enum是一种只是枚举常量的类型。
要使用Enum,您仍然需要它的实例,在这种情况下,该实例可以是静态的。
public enum Unit
{
psi,
psf,
mPa,
Pa,
hPa,
kPa,
MPa,
mmH2O,
mH2O,
inH2O,
ftH2O,
mmHg,
inHg,
atm,
bar,
kgcm2
}
public static Unit MyUnit { get; set; } = Unit.hPa;
答案 2 :(得分:0)
转换是一个变量,如果您要从静态方法调用它,则必须将其声明为静态。
原因是非静态变量/方法属于类的某个实例,静态变量/方法不属于,它们只是类的静态部分(即,您可以在不实例化类的情况下调用它们) )。
单位不是变量也不是方法,它是一种类型,因此它不会绑定到特定实例。
枚举在类中定义的事实使它nested意味着你必须引用包含它的类才能使用它,但它并没有改变它的含义。没有绑定任何实例。
答案 3 :(得分:0)
请记住,conversions
是一个包含对象的实例的静态变量。因此,
{ Unit.psi, 6894.76 },
{ Unit.psf, 47.9 },
{ Unit.mPa, 0.001 },
// ...
只是字典中的普通条目。
有过度简化的风险,enum
是type,而不是任何实际的实例。 (注意:enum
的&#34;基础&#34;类型是int
)。类型不需要是静态的,以便在静态变量和方法中使用;例如,您的静态变量的类型为Dictionary
,绝对不静态。
如果它有用,当你执行类似Unit.mPa
之类的操作时,请将其视为常量,而不是检索实际实例。实际上,documentation将枚举定义为&#34; ...一个由称为枚举器列表的一组命名常量组成的不同类型。&#34;
我的观点是,这里唯一真正有意义的是变量和方法。显然,如果方法是静态的,那么变量也必须是静态的(尽管反过来不是真的;你可以从实例方法中调用静态变量)。
希望这能澄清一些事情(如果没有请随意评论,以便我可以编辑)。