【问题标题】:How to sum two objects?如何对两个对象求和?
【发布时间】:2011-09-13 22:45:27
【问题描述】:

我想做一个解析文本的应用程序。到目前为止,我有一个名为 Result 的类,它保存值并键入方程的每个部分。

public enum ResultType
{
    Int32,
    Double,
    Boolean,
    Color,
    DateTime,
    String,
    Undefined,
    Void
}

public class Result
{
    public object Value { get; set; }
    public ResultType Type { get; set; }
}

可能的结果可能是:

 5 : Int32
 true : Boolean 
 DADACC : Color 
 "Hello World!" : String 
 10.0 : Double 
 13/11/1986 : DateTime

现在我想求和/除法/pow/...两个结果,但我真的不想做所有的工作。在 C# 中,您可以将它们混合在一起并得到答案。

var value = "Hello" + 2.0 + 4 + DateTime.Today; (value = "Hello2413/09/2011 12:00:00 a.m.")

有没有简单的方法来处理这个问题?还是我必须自己弄清楚所有组合?我正在考虑类似的事情:

var Operator = "+"; // or "-","*","/","^","%"
var sum = DoTheCSharpOperation(Operator, ResultA.Value, ResultB.Value)
var sumResult = new Result(sum);

【问题讨论】:

  • 颜色的力量的布尔值是什么?
  • 听起来你真正想要的是一种编程语言。您真正想解决什么问题?
  • 这一切都可以在 C# 中运行,因为编译器会确定应用哪些运算符(如果有)并生成正确的 IL。这一步是非平凡的
  • 布尔颜色的幂是“不能做的”的一个例外。我想用 C# 的大脑来计算两个对象的总和是什么(每个对象都有一个类型,编译器知道类型是什么)
  • 我认为您应该将输入示例反转为输出并使输出与输入值匹配...我认为...因为我 认为 我理解您的问题...

标签: c# types sum operator-keyword


【解决方案1】:

这听起来像是“动态”关键字的完美应用:

using System;
using System.Diagnostics;

namespace ConsoleApplication33 {
  public static class Program {
    private static void Main() {
      var result1=DoTheCSharpOperation(Operator.Plus, 1.2, 2.4);
      var result2=DoTheCSharpOperation(Operator.Plus, "Hello", 2.4);
      var result3=DoTheCSharpOperation(Operator.Minus, 5, 2); 

      Debug.WriteLine(result1); //a double with value 3.6
      Debug.WriteLine(result2); //a string with value "Hello2.4"
      Debug.WriteLine(result3); //an int with value 3
    }

    public enum Operator {
      Plus,
      Minus
    }

    public static object DoTheCSharpOperation(Operator op, dynamic a, dynamic b) {
      switch(op) {
        case Operator.Plus:
          return a+b;
        case Operator.Minus:
          return a-b;
        default:
          throw new Exception("unknown operator "+op);
      }
    }
  }
}

【讨论】:

  • 您能解释一下为什么这样有效吗?它有效,但如何?:D
  • 如果可以的话,我很想解释一下,但这个话题又大又复杂,我可能不会公正地解释。基本上它是“动态语言运行时”的一部分,旨在支持动态语言,如 Ruby 和 Python。基本思想是编译器编写代码来记录您尝试对动态类型执行的操作,然后在运行时运行时系统确定如何执行此操作。 “你试图做什么”我的意思不仅是使用运算符,如我们上面的示例,还包括函数调用、访问属性、显式强制转换或转换等。
  • 它可以做的事情非常复杂——基本上是在运行时做出编译器会做出的决定。如果以不规范的方式使用,它可能会使您的程序成为维护的噩梦,但在正确的情况下它非常有用。这个网页可能是开始阅读的好地方:codeproject.com/KB/cs/TheDynamicKeyword.aspx
  • 这是另一个可爱的小程序,它演示了如何将它用于双重调度: using System.Diagnostics;命名空间 N { 类程序 { 静态无效 Main() { 动态 a=new A();动态 b=新 B();动态 x=新 X();动态 y=new Y(); a.Foo(x); a.Foo(y); b.Foo(x); b.Foo(y); x.Foo(a); } } 类 A { public void Foo(X x) { Debug.Print("in A.Foo(X)"); } public void Foo(Y y) { Debug.Print("in A.Foo(Y)"); } } 类 B { public void Foo(X x) { Debug.Print("in B.Foo(X)"); } public void Foo(Y y) { Debug.Print("in B.Foo(Y)"); } } X 类 {} Y 类 {} }
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多