Skip to content

Instantly share code, notes, and snippets.

@Tokeiya
Created September 2, 2020 11:12
Show Gist options
  • Save Tokeiya/f4d43805ae9c0de4e590aec7d79da7ad to your computer and use it in GitHub Desktop.
Save Tokeiya/f4d43805ae9c0de4e590aec7d79da7ad to your computer and use it in GitHub Desktop.
relationship of dynamic parameter and visibility.
using static System.Console;
namespace Playground
{
public class OuterClass
{
public OuterClass(int value) => Value = value;
public int Value { get; }
public static bool operator ==(OuterClass x, OuterClass y)
{
WriteLine($"{nameof(OuterClass)}.op_Equality is called.");
return x.Value == y.Value;
}
public static bool operator !=(OuterClass x, OuterClass y)
{
WriteLine($"{nameof(OuterClass)}.op_Inequality is called.");
return x.Value == y.Value;
}
}
class Program
{
static void Main(string[] args)
{
dynamic x = new InnerClass(42);
dynamic y = new InnerClass(42);
//InnerClassはUseDynamic.CallOpEqualityViaDynamicから不可視なので、Objectのop_Equalityが呼ばれて、falseになる。
WriteLine(UseDynamic.CallOpEqualityViaDynamic(x, y));
WriteLine();
x = new OuterClass(42);
y = new OuterClass(42);
//OuterClassはUseDynamic.CallOpEqualityViaDynamicから可視なので、Outerのop_Equalityが呼ばれて、trueになる。
WriteLine(x == y);
}
private class InnerClass
{
public InnerClass(int value) => Value = value;
public int Value { get; }
public static bool operator ==(InnerClass x, InnerClass y)
{
WriteLine($"{nameof(InnerClass)}.op_Equality is called.");
return x.Value == y.Value;
}
public static bool operator !=(InnerClass x, InnerClass y)
{
WriteLine($"{nameof(InnerClass)}.op_Inequality is called.");
return x.Value == y.Value;
}
}
}
static class UseDynamic
{
public static bool CallOpEqualityViaDynamic(dynamic a, dynamic b) => a == b;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment