考慮這個例子,
public class NumberAsIs
{
public NumberAsIs(double number) { _number = number; }
public double Value => _number;
private double _number;
}
public class Percentage
{
public Percentage(double number) { _number = number; }
public double Value => _number * 0.01;
private double _number;
}
class Program
{
static void Main(string[] args)
{
var a = new NumberAsIs(1);
var b = new Percentage(2);
var c = a.Value b.Value; // Expect c = 1.02
}
}
因為 NumberAsIs 和 Percentage 的唯一目的是為它們的 Value 方法呼叫它們,有沒有辦法將它們作為值型別呼叫?例如,
class Program
{
static void Main(string[] args)
{
var a = new NumberAsIs(1);
var b = new Percentage(2);
double c = a b; // Expect c = 1.02
}
}
我不想重新定義 operator ,而是僅通過呼叫物件來訪問數值。如果不可能,就說不,詢問以防萬一有我不知道的解決方法/糖語法。
問題大致與另一個有關:C# 中的值型別類定義?
uj5u.com熱心網友回復:
您可以嘗試實施implicit operator:
//TODO: better use struct, not class
public class NumberAsIs {
...
public static implicit operator double(NumberAsIs value) => value.Value;
}
//TODO: better use struct, not class
public class Percentage {
...
public static implicit operator double(Percentage value) => value.Value;
}
現在你可以把
var a = new NumberAsIs(1);
var b = new Percentage(2);
// double c = 1.02 as expected
var c = a b;
// 0.98
var c2 = a - b;
// 0.02
var c3 = a * b;
uj5u.com熱心網友回復:
如果您定義兩個方向:
public class NumberAsIs
{
private readonly double _number;
private NumberAsIs(double d) => _number = d;
public static implicit operator double(NumberAsIs value) => value._number;
public static implicit operator NumberAsIs(double value) => new NumberAsIs(value);
}
public class Percentage
{
private readonly double _number;
private Percentage(double d) => _number = d/100.0;
public static implicit operator double(Percentage value) => value._number;
public static implicit operator Percentage(double value) => new Percentage(value);
}
這意味著你可以這樣做:
NumberAsIs a = 1;
Percentage b = 2;
var c = a b; // Expect c = 1.02
Console.WriteLine(c); //prints 1.02
uj5u.com熱心網友回復:
我認為您想要的是保持定義的值,但double使用任何適用的轉換因子將其轉換為。
這里 通過呼叫隱式轉換來處理諸如etc 之類的操作double。
public struct Number
{
public Number(double value) : this()
{
Value = value;
}
public static implicit operator double(Number number)=>number.Value;
public static implicit operator Number(double value) => new Number(value);
public double Value { get; }
public override string ToString() => $"{Value:g}";
}
public struct Percent
{
public Percent(double value) : this()
{
Value = value;
}
public static implicit operator double(Percent number) => number.Value/100;
public static implicit operator Percent(double value) => new Percent(value * 100);
public double Value { get; }
public override string ToString() => $"{Value:g}%";
}
static class Program
{
static void Main(string[] args)
{
Number a = new Number(1.0); // 1.0
Percent b = new Percent(2.0); // 2%
double c = a b;
Console.WriteLine($"{a} {b} = {c}");
// 1 2% = 1.02
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/387566.html
