►
From YouTube: .NET Design Review
Description
00:00:00 - Approved: Configuring request options in Browser WebAssembly https://github.com/dotnet/runtime/issues/34168#issuecomment-637712249
01:05:10 - Approved: ICastableObject interface https://github.com/dotnet/runtime/issues/36654#issuecomment-637742472
A
A
A
B
It's
based
on
Cory's
proposal
for
some
other
API,
which
basically
did
this
was
a
more
strongly
typed
dictionary
property
back
of
sauce,
and
so
no
you
wouldn't
get
you
weren't
getting
loose
strings.
You
were
getting
like
typed
values
back
out
of
things
so,
like
you
had
some
like
some
level
of
typing
to
it,
and
then
I
have
some
examples
of
like
how
you
might
possibly
use
this.
C
A
D
A
D
A
A
Yeah,
that's
what
we
thought
last
time.
The
problem
of
that
is
that
people
can
cast
it
away
right.
So
if
you
expose
the
AI,
HTP
request
option
somewhere
and
you
actually
just
base
we're
the
cover,
just
hold
it
as
an
HTTP
request
options
thing,
then
people
can
cast
it
and
then
still
add
stuff
to
it
right.
So,
if
that's
the
immutability
aspect
is
important,
then
you
probably
need
a
decent
internal
implementation
of
this.
Some
other
people
can't
castaway,
which
I
think,
generally
speaking,
will
probably
defeat
the
purpose.
A
A
Mean
my
default
assumption
is
then,
when
API
requests
come
home,
asp
net,
they
usually
start
of
interfaces
because
that's
kind
of
like
their
I,
don't
know
aesthetic
of
style,
choice
for
most
of
the
functionality
in
asp
net
and
that's
okay.
But
like
many
bc,
Aleph
ID.
We
have
to
think
about
that
and
make
sure
that
we
don't
just
have
interfaces
for
you
know
stylistic
reasons,
but
they
actually
meaningful
and
then
also
whether
we
can
convert
some
some
of
them
to
abstract
based
types
because
they
usually
version
better
than
interfaces.
A
A
Mean
it
certainly
seems
more
closer
to
what
we
want
this
to
look
like
based
on
the
initial
discussion
we
had.
So
maybe
we
should
just
end
it
here,
like
you
know,
maybe
drill
into
the
interface
again
and
see
what
whether
we
actually
need
this
and
whether
immutability
is
important
there
and
then
maybe
convert
it
to
a
builder
or
just
a
feasible
type,
and
then
let
quarry
respond
to
that.
We
could
take
another
look,
a
Thursday
and
whatever
I
mean.
D
So
it
seems
like
you
just
want
an
extra
headers
collection
if
it's
more
complicated
than
that
then
ensure.
But
we're
gonna
have
the
same
problem
on
this
one
that
we
were
talking
about
with
the
system
that
connections
one,
which
is.
How
does
someone
know
what
keys
and
such
to
use
if
it's
just
headers,
that's
easy?
It's
headers,
they're
public.
B
So,
at
least
in
this
case,
I
was
like
this
one
like
odd
scenario
where
you
didn't
want
to
send
like
more
than
like
a
Hydra
value.
It
was
like
a
boolean
value
that
configured
how
the
HTTP
response
was
being
read
and
I.
Think
it's
listed
like
up
there.
So
I
mean
it's
something
that
the
HP
client
and
whether
simply
already
does
so
it's
not
something
that,
like
I'm,
not
saying
that
it
is
correct
or
like
that's
the
best
way
to
go
about
it.
B
It
was
just
like
if
we
had
that
feature,
and
we
had
to
use
this
as
a
way
to
configure
it.
Like
you
know,
he
having
a
named
option
would
like
or
having
a
strongly
that
option
kind
of
help.
Stir
the
the
headers
do
like,
like
I
guess,
like
libraries
that
care
about
the
headers
would
like
all
these
options
would
have
like
static
types
that
exposed
slim.
So
you
know
so
you
would
have
like
a
browser
request
options
or
something
like
that
could
have
like
all
of
these
keys
in
there.
C
One
other
thing
to
keep
in
mind
as
we're
reviewing
or
revising
this
is
I'm.
These
objects
are
already
heavier
weight
than
we
would
like,
like
you
should
be
request
message
already.
Has
we've
been
trying
to
trim
it
down
when
trying
to
play
internal
tricks
to
reduce
state?
I
will
probably
still
continue
to
try
and
do
more.
So
anything
that
increases
the
size
is
a
little
concerning
just
because
we're
we're
using
these
more
and
more
in
situations
where
we
actually
care
about.
You
know
as
much
throughput
as
we
can
yet.
B
C
C
B
So
for
the
plea
to
release
like
just
because
laser
didn't
require
shipping,
some
of
these
API
is
like.
We
ended
up
using
like
the
property
bag
and,
like
you
know,
a
bunch
of
like
private.
Like
a
you
know,
a
well
known
key
that
the
laser
implementation
and
the
web
assimilation
knew
about,
and
you
know
using
that
that
works
kind
of
well
and
out.
But
then
I
don't
know
how
well
it
scales
for,
like
an
arbitrarily
large
number
of
libraries
trying
to
like
work
on
it.
C
I'm
not
saying
I'm
against
the
strongly
type
of
thing
I'm
just
saying
if
we
can
find
a
way
to
to
not
grow
the
state
by
default.
That
would
be
great.
So
that
might
be
that
we
changed
the
existing
field
from
the
collection
that
it
is
to
an
object
and
we
allow
it
to
store
either
the
strongly
types
or
the
non
strongly
typed.
C
We
only
bloke
both
it
may
be
that
we
store
the
strongly
typed
inside
the
non
strongly
typed
or
you
know
we
can
play
various
tricks,
but
it'd
be
great
to
think
through
the
design,
the
implementation
as
we're
thinking
through
the
design.
Just
to
avoid
adding
more
overhead.
For
this.
You
know
scenarios
like
being
used
in
a
reverse
proxy
or
folks
that
are
trying
to
kind
of
just
get
as
much
throughput
as
they
can
using.
This
should
be
clients.
B
Guess
we
can
focus
on
the
like
what
the
abstraction
would
look
like
to
configure
it.
Just
like
I,
don't
hear
anything,
anyone
saying
specifically,
if
like
adding
the
extra
parameter
to
like
all
of
these
methods,
it's
problematic
it's
just.
How
do
we
actually
expose
it.
D
D
B
So
if
you
scroll
it
down,
that's
a
scenario
where,
if
you
were
trying
to
electrically,
have,
for
example,
something
else
pretty
use
it,
but
then
before
it
sends
a
request
like
something
else:
produces
the
SCP
request
message
for
you
or
there
should
be
content
for
you
when
you
want
to
assign
this
on
top
of
it.
So
I
guess
appeal.
Why.
A
This
in
our
that
he
has
in
mind,
is
more
like
the
HCP
extension
methods,
one
where
you'd
never
see
the
message
right.
The
extension
methods
directly
create
the
options
and
you
mainly
send
it
off.
So
this
is
an
example
where
you
basically
would
change
to
get
from
a
Jason,
a
Singh
extension
method
to
take
a
request
options
because
I
love
wise,
you
would
have
to
do
everything
by
hand,
but
that
doesn't
necessarily
imply
that
we
need
to
have
well
delete
a
sink
and
get
a
Singh
and
send
a
Singh
right
right.
D
So
the
yeah
I
mean
the
extension
method.
That's
based
on
you,
know,
URI
and
and
such
obviously
the
the
input
would
need
to
come
from
somewhere,
but
yeah
I
mean
if
we
think
that
this
is
advanced
and
somebody
who
wants
to
do
it
is
already
building
a
request
message.
Then
that
doesn't
mean
we
can
drop
all
of
the
modifications
to
HTTP
client
and
just
add
it
to
the
Jason
extensions
and
then
the
the
one
property
on
HTTP
request
message:
I'm.
D
A
C
Think
the
intent
of
those
those
methods
on
HP
client
is
their.
The
the
trivial
superfast
like
all
you
want
to
do
is
specify
the
URL
and
then
oh
yeah,
I
cancellation,
delegate
and
anything
beyond
that.
Is
you
start
getting
into
the
realm
of
you?
Produce
HTTP,
request
message
so
then,
adding
in
these
one-off
options
for
this
or
that
that
makes
me
a
little
nervous.
B
Mean
at
least
of
webassembly,
like
most
of
the
scenarios,
probably
revolve
around
sending
and
receiving
Jason,
so
we
can
be
happy
with
to
have
Jason
to
start
with
and
then
like.
If
you
do
end
up
getting
a
lot
of
feedback
we're
like
you
know,
people
are
trying
to
like
use,
delete,
he's,
saying
or
something
like
that
and
need
to
configure
these
options.
We
can
always
add
them
later
on,
like
it's
not
a.
A
It
seems
for
the
web
assembly
scenario
that
probably
so
rather
than
paralyzing,
that
both
of
them
prioritizing
delete
async
at
a
sing
and
Sunday
sync.
It
seems
you're
better
off
prioritizing
some
extension
methods
over
the
options
from
I
collect
like
this
set
browser
request.
Cache,
for
example,
rather
than
asking
people
to
go
through,
the
generic
you
know
add
key
value
pair
API.
A
So,
rather
than
like,
it
seems
like
what
we
are
saying
is
the
read
async,
async
and
sentencing
overloads
the
take
request.
Options
are
not
that
important
right
now,
but
for
web
personally,
what
seems
more
useful
is,
if
you
ever
have
to
add
extension
methods
over
the
request
options
type
to
make
setting
whatever
the
Weathermen
specific
settings
are
more
convenient,
so
people
don't
have
to
go
through
the
generic
key
value
pair
API,
because
if
I
go
request,
options
dot
add
like
how
the
heck
am
I
finding
browser
request
options
to
begin
with
right.
B
D
B
B
Like
in
this,
like
I,
think
like
T
or
your
design
bear
like
the
type
was
he's
like
how
the
semblance
of
immutability
made
it
like
difficult
to
configure
it,
but
if
you
say
like
it
has
API
so
like
I,
do
it
like
that
problem
is
solved?
You
don't
need
you
don't
need
to
explicitly
pass
another
thing
to
like
figure
out
how
to
merge,
because
you
just
set
it
on
the
request
position.
Yep.
A
A
G
C
C
Is
there
a
design
where
we
don't
add
anything
to
a
street
request
message,
and
we
just
have
like
you
know
if
you
want
to
pull
one
of
these
out.
This
is
the
name
that
it'll
begin
and
you
get
out
your
request
options
from
that
I'm
gonna.
Try
to
balance.
You
know
usability
for
the
common
case
with
usability
for
this
or
for
the
broader
case,
with
usability
for
the
blazer
case.
I
guess.
D
A
D
A
C
Or
I
mean
there's
the
middle
ground,
you
still
have
the
interface
or
whatever
and
there's
a
known
key
to
pull
out
that
from
the
property
bag.
So
you
don't
add
another
property
names
for
your
quest
message.
You
just
say:
if
you
want
this
object,
is
gonna
be
living
in
this
property
back
then
that
has
downsides
as
well
I'm,
just
trying
to
think
about
how
there's
there's
now
two
different
things
and
neither
of
the
two
shall
meet,
and
it
feels
just
walking
up
to
the
API.
It
feels
weird
I
mean.
A
Unfortunate
thing
is
we
decided
to
make
the
property
bag
generic
right
so
as
I
dictionary
of
string
comma
objects?
So
it's
very
weird
to
pause
that
around
and
it
makes
it
almost
impossible
for
us
to
add
extension
methods
over
it.
I
mean
we
could,
but
we
generally
don't
like
doing
that
right.
So
I
guess
one
takeaway
for
me
would
be
every
time
you
had
a
property
back.
We
should
have
a
very
specific
type
for
that
and
not
some,
you
know,
generate
connection
type,
but.
D
We
can
certainly,
we
can
add,
you
know,
set
cash
option
which
just
uses
a
well-known
key
and
sets
the
thing
and
get
cash
option,
which
just
does
the
try
get
value
on
the
well-known
key,
like
the
fact
that
we
have
diction
or
string
object
like
it,
doesn't
really
change
anything
other
than
theirs.
You
know
if
somebody
uses
the
same
key
and
shoves
the
wrong
kind
of
thing
in
it,
but
right.
A
D
A
Guess
my
point
is
that
I
think
the
to
the
way
it's
designed
right
now
is
so
if
we
want
to
add
a
strongly
typed
helper
for
a
request
option,
we
can
just
define
an
extension
method
over
HTTP
request
options
or
even
add
the
API
directly
onto
an
HTP
request
options
right.
That
option
doesn't
quite
exist
for
an
addiction
area
of
string,
comma
object
right,
that's
kind
of
I!
Think
where
the
problem
is
I
mean.
D
A
C
A
Fact
it
could
go
a
step
further
and
say
this
property
that
we
only
have
we'll
leave
it,
as
is
the
market
editor
plausible?
Never
we
had
a
new
property
on
message.
Options
make
that
strongly
typed
and
make
the
properties
effectively
just
return.
This
guy,
then
we
have
literally
one
storage.
The
new
thing
is
get
set
and
strongly
typed,
and
that
should
solve
most
of
the
problems.
Then
yeah.
H
I
C
C
D
You
know
I
wonder
if
it's
just
gonna
be
a
bad
experience
for
people
as
they
straddle
or
if
they
straddle
versions
or
like
well.
Upgrading
like,
on
the
one
hand,
I
see
the
argument
for
hiding
it.
On
the
other
hand,
I
see
one
for
not
hiding
it
and
then
maybe
we
just
mark
it
obsolete
and
say
you
prefer
the
options
instead,
I.
D
I
A
Yeah
I
mean
works,
for
me,
I
mean
in
this
case
generally
speaking,
I
don't
like
hiding
API
is
because
when
you
call
them
it
gets
annoying,
but
in
this
case
like
why
would
you
ever
use
properties?
If
you
have
options
right,
they
really
isn't
the
reason.
In
fact,
you
can
treat
options
as
an
addiction
area
of
string
objects.
So,
even
if
you
pass
it
around
I
mean.
A
D
D
A
I
mean
what
I
like
about
the
design
is
that
it
composes
very
cleanly
right.
Basically,
the
semantics
is
for
things
like
Jason.
You
just
construct
the
message
you
assign
the
options
directly.
If
you
work
with
the
message
you
just
work
with
the
options
there,
it's
it's
it's
strongly
typed.
It
can
be
strongly
typed.
We.
D
D
E
D
D
A
D
My
recollection
is
in
through
any
kind
of
is
that
the
evaluation
is
first
done
with
no
regard
to
extensions,
so
if,
if
it
can
work
with
an
instance
method
that
will
always
win
I
mean
if
it's
you
know,
even
if
you
had
an
exact
type
match
on
the
extension
method
and
something
took
object
on
as
an
instance,
the
object
instance
wins
is
my
recollection.
There's.
A
B
A
D
D
A
D
A
D
D
D
D
D
D
A
A
D
A
A
Guess
the
problem
is,
you
need
to
define
like
what
like
big,
because,
basically,
if
I
should
be
request,
options
implements
an
ideation
area.
The
question
is:
do
you
want
all
the
api's
or
nine
dictionary
to
be
in
the
public
surface
right
like,
and
this
goes
back
to
what
I
said
earlier
about
what
semantics
do
you
have
because,
like
what
do
you
want
people
to
assume
options
like
how
like
how
do
you
want
them
to
work
with
options?
You
want
them
to
set
everything
or
do
you
want
them
to
try?
A
Everything
and
a
dictionary
is
not
necessarily
communicating
that
very
well,
because
if
you
open
intellisense,
you
see
like
the
typical
dictionary
methods
versus
in
your
case
Chrome.
They
only
have
two
methods
and
I'm
not
sure
what
you
intended
ad
to
do.
If
you
intend
an
ad
to
behave
like
a
dictionary
ad,
meaning
it's
those
when
the
keys
already
said,
or
did
you
expect
that
to
be,
you
know
if
it
sets
it,
if
it's
not
there,
and
it
adds
that
otherwise
and
so
I
would
kind
of
decide
on
what
the
semantics
are
and
then
based.
D
E
D
A
D
I'm
just
looking
and
thinking
so
we
have
these
strongly
type
things
and
then
we
have
like
it
contains
key
string
right
and
it
it
does
feel
like.
We
have
a
good
reason
for
having
the
addiction
area
of
string
object
here
so
that
we
have
compatibility
with
the
existing
API,
but
that
really
that's
a
compat
detail,
not
a
public
detail,
so
yeah.
D
D
I
mean
if
we
expect
them
to
be
instantiated
once
ever,
I
mean
it
would
be
a
it
could
just
be.
It
could
be
a
class
wrapping
the
string
instead
of
a
struct
wrapping.
The
string
gives
the
default
constructor
and
yeah
walks
through
one
more
indirection
to
get
there,
but
that's
not
the
end
of
the
world
seems.
A
I
B
Mean
which,
for
a
lot
of
these
things,
might
be
true
right,
like
you're
setting
credentials
through
casual
or
all
of
these
options,
they
would
there's
only
one
of
them
and
you're
always
setting
them
like
it
becomes
interesting.
If
you
start
wanting
to
send
like
bulls
and
like
more
primitive
types,
I.
A
Guess
that's
true!
If
you,
if
your
types
are
compound
already,
then
they're
publishing
news
by
that
I
mean
in
the
end
it's
probably
doesn't
matter
one
way
or
the
other,
because,
as
Jeremy
said,
you
very
likely
define
a
static
type.
Some
ever
you
define
all
the
keys.
So
whoever
doesn't
just
pause
it
either
a
string
directly
above
it
which
is
done
by
our
name
of
or
they
type
it
out.
Right,
like
it's
probably
doesn't
matter
like.
E
B
A
You
would
reject
in
I
mean
that's
kind
of
the
same
thing
happens
of
a
race
right
when
you
have
an
array
of
customer
and
then
somebody
costs
it
to
an
array
of
object
and
then
assigns
into
it.
Then
you
get
in
I
forgot
what
the
exception
is.
You
are
getting,
but
basically
you
get
a
type
mismatch
exception
that.
D
Yeah
I
would
try
methods
they're
supposed
to
have
a
clear
answer
of
what
false
means
and
so
having
to
try
to
get
the
strongly
or
the
generic
try
get
value
return
false.
If
and
only
if
the
string
wouldn't
return,
false
is
good
and
then,
if
the
string
will
return
true,
but
it's
the
type
doesn't
make
sense,
then
yeah,
that's
a
invalid
cast
exception,
just
hard
cast
it
and
let
the
runtime
deal
with
it.
Okay,.
D
L
A
A
F
B
A
A
G
A
A
L
L
This
is
kind
of
an
extension
of
the
comm
wrappers
API
that
was
approved,
moved
in
dotnet
v.
This
is
the
RC
W
side
of
that,
so
that
I
don't
need
to
know.
Maybe
I
don't
know
at
all
the
types
it's
the
I
have
a
hidden
interface
on
here
that
isn't,
in
whatever
description
of
my
comm
objects
and
I
want
to
be
able
to
query
if
that's
really
what
it
comes
down
to
so.
L
L
It
is
not
that's
true.
This
support
is,
this
is
a
runtime.
This
is,
this
is
support.
That
would
could
be
added
and
say,
you've
written
some
sort
of
object,
and
if
you
hire
hot,
if
you
can,
you
have
implemented
I
castable
object
and
during
the
cast
c-style
cast
and
c-sharp,
it
says
nope
this
doesn't
exist
and
you
implement
this
interface.
You
have
an
opportunity
to
say:
I
do
are
I
can
make
that
determination
at
runtime
instead
of
just
letting
the
runtime
determine
it
from
the
metadata.
D
L
L
Participant
asks
for
something,
and
they
want
to.
They
want
to
permit
that
operation
to
happen.
This
is
actually
safe,
they're,
either
with
the
well.
This
is
only
safe
because
of
things
like
default
interfaces
like
we're
really
leveraging
a
lot
of
the
new
c-sharp
language
features
that
allow
us
to
implement
this
in
a
safe
way.
L
D
Okay,
so
effectively,
this
can
be
used
for
you
had
to
do
a
lot
of
work,
but
you
made
duck
typing
work.
Yes,
what
would
happen
if
you
didn't
like
if,
if
an
interface
had
an
unbound
member
I
think
is
it
gonna?
Do
late
binding
on
the
on
the
object
to
find
a
compatible
slot,
or
is
that
unstable
or
is
that
a
throw
I
guess
I
want
to
know
if
we're
adding
something,
that's
doing
like
blind,
vtable
six
jump,
no.
L
It
is
not
so
if
you
look
at
the
in
in
the
actual
I
got
a
proposal,
there
was
some
debate.
What
is
what
is
the
failure
case
here
like
if
what,
if
someone
decides
to
do
something
very
cheeky
and
try
to
trick
the
system-
and
we
investigated
that
an
Eleanor
who's
actually
already
has
an
implementation
up
and
linked
against
this
was
able
to
say,
was
able
to
mitigate
that
in
a
safe
way
and
basically
it'll
fall
back
and
say
this
doesn't
have
an
implementation
for
that
slot.
So.
A
A
L
Would
be
that
would
be
where
it
would
be
fair,
like
everything
else.
So
if
we
just
look
at
this
from
me,
I'm
not
calling
any
function,
I'm,
not
calling
any
functions
on
I
foo
it
the
when
I
cast
a
B
to
I
when
I
cast
the
bar
to
a
I
foo.
At
that
point,
there's
really
it's
all
types.
It
is
correct.
We
have
the
appropriate
I,
guess
method
table
for
a
knife
ooh
when
we
dispatch
to
it.
One
of
two
things
is
gonna
happen,
one.
F
L
A
Against
my
other
question
is,
maybe
I'm
not
seeing
it,
but
it
seems
like
we're
going
out
of
our
way
to
make
something
couple
in
a
different
way.
I
guess
I
mean
how
is
this
different
from
me
implementing
I
foo
directly
on
bar,
because
it
seems
bar
already
has
to
be
aware
of
Eiffel
anyways
in
order
to
implement
this
get
interface
implementation
method.
It
knows
about
I
for
right,
so
it
still
can't
extend
bar
from
outside
of
bar.
So.
L
Yes,
I
think
conceptually.
That
is
the
that
is
the
canonical
example,
because
metadata
is
that,
but
the
example
that
we
were
using
here
is
the
RCW
concept.
So,
instead
of
instead
of
calling
this
bar,
let's
just
assume
that
it
was
underscore
underscore
a
comm
class
or
underscore
underscore
comm
object
in
our
CW,
so
I
don't
know,
and
all
I
have
that's
associated
with
that
underscore
underscore
calm
object
is
an
int
pointer,
I.
A
L
A
L
L
H
L
L
Can
is
this
something
that
we
could
do
with
dynamically
expanding
a
type
and
like
theoretically?
Yes,
you
could
I,
don't
don't
know
if
that
I
would
advocate,
for
that.
That
seems
like
a
Pandora's
box
of
your
making
system
very
complicated,
but
if
there
is
some
value
to
it,
then
yeah
you
could
do
that.
I.
A
A
Think
last
of
it
we
talked
about
this
as
well
like
I,
Castle
object
sounds
very
generic
and
very
appealing
right,
and
so
how
much
of
this
stuff
is
tied
to
calm
calm
like
does
it
work
cross-platform,
for
example,
and
does
it
work
with
any
interfaces
or
are
there
any
restrictions
that
are
not
outlined
here?
No.
L
L
L
A
L
A
L
L
Just
to
complete
I
guess,
maybe
for
the
whole
historical
thing,
dotnet
native
had
two
implementations:
they
had
AI
castable
and
then
there
was
also
a
castable
object.
Implementation.
The
AI
castable
did
not
have
any
restrictions,
because
at
the
time
there
was
no
way
to
provide
an
implementation
to
an
interface
in
c-sharp.
So
it
basically
said
give
me
any
type
and
I
will
let
you
do
your
job,
which
is
very,
very
dangerous,
because
you
could
have
fields
and
you
could
have
all
sorts
of
random
problems.
L
There
was
another
implementation
which
was
castable
object,
which
was
a
abstract
base
class
and
it
had
a
bunch
of
private
state
that
allowed
you
to
store
things
and
that
allowed
you
to
again
to
cast
to
any
type
in
this
case,
because
we
have
default
interfaces,
we
could
very
tightly
restricted
to
saying
it
has
to
be
an
interface
type
that
you
return.
It
has
to
have
this
attribute
and
we
know
that
it's
safe,
because
we
we
are
not
gonna,
have
any
field
accesses.
We're
not
gonna.
A
When
it
sounds
like
a
pretty
much,
it
will
work
for
any
interface
right,
because
the
interface
itself
head
doesn't
have
to
be
marked
right.
So
it's
only
the
in
the
in
by
me
providing
the
implementation
for
the
interface.
That's
when
I
have
to
mark
my
own
implementation
for
that,
but
that's
pretty
much
it
so
it
should
literally
work
for
any
interface
and
pretty
much
any
object
so
long.
The
object
and
implement
I
cast
a
blue
object
right.
D
D
And
so
theoretically,
this
means
like
just
just
thinking
through
experience,
if
I
foo
extended
I
other
and
someone
didn't
explicitly
register
I
other
as
the
target.
If
they
went
through,
I
foo
first
the
cast
will
succeed
and
then,
when
they
goes
to
I
other,
it
will
explode
because
it
can't
figure
out
how
to
take
that
object
and
turn
it
to
an
eye
other,
because
it's
it's
a
bar,
it's
not
actually
the
VI
foo
in
pull
or
is
it
or
is
the
does
it
know
it's
an
eye
foo
in
pull
at
that
point
or.
B
D
I
have
I,
have
a
bar
and
I
do
I,
cast
it
into
into
I
foo
and
then
I
cast
that
into
I
other,
with
this
being
exactly
the
same
as
it
is
right
now.
Well
that
second
cast
succeed,
or
will
it
fail
because
it
sees
it's
a
bar,
it
asks
good
interface
implementation,
it
says
I
didn't
handle
I
other,
and
then
it
fails
so.
D
A
D
What
happens
so
there
get
interface,
implementation
explicitly
was
against
I
foods
type
handle
which
is
fine
and
a
cast
has
already
succeeded
to
I
foo,
but
now,
if
something
is
turning
it
into
an
eye
other.
So
like
you
called
a
method
that
took
a
knife
ooh,
it
does
the
dynamic
thing
you
get,
this
middle
interpreted,
rapper
class
and
then
it
passes
that
to
a
method
that
takes
an
eye
other.
Does
any
conversion
happen
at
that
point
and
does
it
succeed
or
fail
so.
L
D
But
let's
say
it
was
just
a
marker
interface
and
therefore
everything
just
worked
that
I
had
no
methods
so
I'm,
just
wondering
if
the
call
site
after
you
get
back
the
I'm
cast
this
to
I
foo.
Does
the
runtime
think
of
it
as
an
I
fou
when
it
goes
into
future,
casts
or
does
it
think
of
it
as
a
bar
which
wasn't
actually
an
eye
foo,
but
things
just
kind
of
worked?
Oh.
D
G
D
Mean
yeah,
like
the
notion
of
like
you,
get
there
and
there's
no
method
like
that
sure
I'm
just
curious.
If
the,
if
the
iPhone
s
is
a
real
I
foo
or
if
it's
a
like
as
long
as
you
don't
squint
or
as
long,
you
don't
look
too
closely,
we'll
just
make
the
syntax
work.
I,
don't
I,
guess
I'm,
just
curious
that
we've
thought
it
through
I,
don't
actually
super
care.
What
the
answer
is.
C
You
make
a
mistake
in
that
there
are
lots
of
things
you
have
to
do
correctly
or
you
have
to
be
returning
an
interface.
You
have
to
have
attributed
that
interface
as
a
castable
object
implementation.
You
have
to
have
provided
default,
implementations
of
all
the
base,
interfaces,
methods
and
X&Y
ins
and
so
on
there.
So
it
seems
like
it's
pretty
easy
to
accidentally.
Not
do
one
of
those
things.
L
Right
sure,
that's
a
that's
a
great
question
so
of
those
three
that
you
mentioned,
which
is
the
attribute
on
it
and
the
you
must
return
an
interface.
Those
are
runtime
checks.
If
you
try
to
use
this
will
blow
up
immediately,
so
no
invalid
type
has
been
returned
from
whatever,
so
you
won't
get
very
far
with
that.
The
the
state,
the
final
one,
which
I
think
is
a
is,
does
probably
warrant
something
which
is
the
we
did.
We
have
not
checked
if
the
interface
that
has
the
attribute
has
an
implementation
for
all
the
functions.
L
F
L
H
Yes,
even
we
could
do
a
simpler
thing
like
we
don't
even
have
to
go
through
the
default
interface
resolution
logic,
because
you
know
the
whole
default
interface
resolution
logic
also
gives
you
variant
casting
support
and
variant
interfaces
which
work
I.
Don't
really
know
whether
we
want
to
deal
with
that.
Maybe
it's
nice,
but
I,
don't
know,
but
you
can
definitely
check
whether
everything
has
implementations
kind
of
when
we
other
default
interface
methods.
H
We
opened
the
Pandora's
box
that
sometimes
you
call
an
interface
method
and
it
doesn't
actually
end
up
calling
anything
and
that's
kind
of
in
the
diamond
case
scenario,
if
you
have,
if
you
have
an
interface
method
that
is
implemented
by
two
different
different
default
implementations
or
more
and
kind
of
when
we
are
trying
to
do
the
dispatch,
we
will
throw
an
exception
instead
of
actually
calling
something
so
kind
of
that.
That's
when
we
opened
up
the
situation
that
you
might
have
something
type
to
some
interface,
but
you
cannot
call
the
methods
on
it.
D
Okay
I
mean,
if
we
have
to
do
it
late,
bound
late
bound
if
we
can
do
it
early,
so
it
looks
more
like
a
type
load
failure.
Then
that
feels
like
it
would
be
probably
more
helpful
to
someone,
because
the
the
failure
is
closer
to
where
the
action
happened,
which
is
you
know,
like
Steve's,
analyzer
suggestion,
but
also,
if
the
that
helps
you
at
compiling
your
type.
But
this
is
the
case
where
the
interface
was
defined
by
else
and
yes
and
the
BCL
we
never
add
members
to
them.
C
L
C
D
L
C
D
L
C
Wasn't
why
wouldn't
this
sorry
I
missed
the
beginning
of
the
discussion?
But
why
wouldn't
this
be
a
try
method
and
leave
all
throwing
up
to
the
runtime.
D
D
Supposed
to
handle
the
I'm
supposed
to
throw
that
means
we'll
end
up
with
potentially
non-standard
exceptions,
non-standard
messages
they
have
the
boilerplate
of,
if
throw
throw.
All
of
that
feels
like
the
one
thing
that
called
this
has
enough
data
that
it
should
do
it
all
in
a
standardized
manner
or
the
two
things.
If
one
of
them's
is,
and
one
of
them
says,
yeah.
L
Well,
the
the
one
of
the
most
annoying
things
in
calm
is
when
it
says
cast
failed
was
like
well
the
cast
really
failed,
but
that's
not
the
problem.
The
problem
is
is
I'm
on
the
wrong
thread,
and
so
you
never
tell
me
that,
and
therefore
I'm
kind
of
like
well
why'd
the
cast
fail
and
I
spend
hours
trying
to
figure
out.
Oh
the
cast
failed
because
it's
actually
on
the
wrong
thread.
It
had
nothing
to
do
with
the
cast
so.
D
In
your
in
the
our
CW's
or
the
CCW,
or
whatever
some
sort
of
CW,
your
throw,
if
not
found,
is,
is
doing
something
different
than
someone
would
do.
If
they're
doing
this
late
bound
duck
typing
for
I
mean
it's
not
exactly
duck
typing
but
yeah.
It's
late,
bound,
dynamic,
cast
they'll
end
up
with
very
boilerplate
looking
code,
but
in
your
in
the
comm
layer,
you're
doing
something
different
yeah.
E
L
I
think
that
your
point
is
fair.
Let's
say
you're
going
down
the
not
using
comm
I'm,
just
being
very
cute
and
I
want
to
add
interfaces.
I
want
my
object
to
support
every
interface
and
so
I
dynamically
generate
whatever.
Yes,
I
agree
with
you
that
in
that
scenario,
it's
probably
fair,
but
there
is
a
whole
slew
of
what
are
we
really
trying
to
expose
here,
and
this
is
the
unknown.
Interaction
between
another
system
and
a
caste
is
not
necessarily
the
appropriate
statement
of
failure.
So
are
you
hoping
that
folks
will
customize.
D
C
C
L
D
D
Cat
I
mean
it's
weird
that
there
is,
would
let
any
exception
leak,
but
certainly
it
didn't
return
true
or
false,
so
so
it
has
to
throw
but
I
wonder
if
letting
arbitrary
exceptions
leak
out
of
this
is
weird
like
that
feels
more
like
at
that
point,
it
should
throw
one
of
the
nasty
things
like
a
seh
exception
like
I'm.
Sorry,
someone
did
something
terrible
we're
done.
We
couldn't
answer
is
yeah.
L
L
A
I,
don't
know
I
mean
I
think
this
goes
also
back
to
what
we
think
the
feature
is
forward.
If
you
think
of
this
is
a
interrupt
kind
of
feature,
I
am
okay
with
saying:
don't
don't
throw
unless
throw,
if
not
found
it's
true.
If
it's
false,
when
you
throw
well,
then
you
have
buggy
interrupts
code.
Don't
do
that
if
you
throw
anything
but
a
limb
with
a
cast
exception,
then
you're
doing
it
wrong.
You
shouldn't
do
that
either.
A
You
should
always
have
him
at
the
cast
exception
and
maybe
customize
the
message
so
that
you
know
consumers
always
get
cast
exceptions
or
not
some
other
render
exception,
and
then
that
seems
fine,
but
if
I
mean
the
thing
we
said
last
time,
which
is
kind
of
where
I
was
heading
earlier
was
I.
Canceled
object
seems
like
both
in
naming
and
in
the
behavior
you
kind
of
described
as
a
you
know.
Yes,
it's
Interop
II,
but
it
seems
like
a
very
useful
feature.
A
I
can
see
being
used
more
widely
than
you
might
want,
so
that
kind
of
means.
Maybe
we
should
make
it
a
bit
more.
You
know
I
had
to
say
it
but
kind
of
idiot
proof
where
people
can't
accidentally
do
the
wrong
things
because
I'm
kind
of
concerned
I
get
this
is
used
in
some.
You
know
advanced
thing
like,
for
example,
our.
A
H
Think
the
important
part
is
still
say
that
these
are
exceptions
that
will
be
thrown
from
the
is
ends
cast
class
and
unbox
and
maybe
maker.
The
type
reference
font
and
kind
of
the
exception
that
these
are
allowed
to
throw
is
specified
in
the
ACMA
spec,
so
kind
of
throwing
something
new
out
of
there
could
potentially
break
tools
like
isn't
failing,
I'm,
not
sure
if
it
will
be
able
to.
D
A
D
A
A
A
A
L
D
L
So
actually,
what
you
said
I,
maybe
I
actually
did
consider
calling
it
I
may
be
or
what
is
it?
What
was
I
also
did
I
I
am
I
am
maybe
or
something
like
that
it
was
like
I
had
a
bunch
of
those
you
know,
other
other
languages
have
those
maybe
constructs
and
I
was
I
tried
that
right,
I
couldn't
think
of
anything
and
and
I
chose.
You
know
we
chose
I
got
I,
cast
a
logic
cuz,
that's.
That
is
what
the
community
knows
as
the
concept
from
the
done
that
native
world.
L
Mean
I,
don't
I
would
be
very
surprised.
Here's
I
guess
here's.
Why
I
think
that
this
would
I
hear
I
hear
the
concerns
about
proliferation
of
usage.
The
thing
that
it
comes
down
to
is
the
implementation
of
the
default
interface
right.
Your
people
are
going
to
get
into
there
and
they're
going
to
realize
the
limitations
that
it
does
yeah.
A
A
A
You
put
it
in
like
interrupt
services,
and
we
have
like
you
know
already
the
flow
that
we
have
here.
We
take
one
time
type
panels
and
stuff
like
it's.
It
seems
certainly
Interop
in
the
way
you
use
it.
So
you
should
expect
interval,
P
style
constraints
as
well.
I
mean
somebody
in
shed
suggests
I
call
rapper
castable
object,
I
mean
that
certain
is
meeting
my
bar
for
ugly
enough,
but
I
guess
it
still
makes
sense
the
way
it
is
here.
D
Yeah,
just
that
I
mean
the
name,
is
I
cast
a
bow
object
it
just.
It
feels
like.
It
applies
to
everything,
instead
of
a
corner
case
that
I
call
rapper,
castable
object
or
I
dynamically
cast.
The
ball
at
least
feel
like
it's
something
other
than
just
the
normal
cast
that
this
is
a
another
thing
happening.
If.
A
I
L
A
D
I
D
A
A
If
you
have,
if
you
have
a
type
called
like
an
actual
derived
type
of
object,
let's
call
it
bar
right
if
the
compiler
sees
bar
and
you
try
to
call
it
to
an
arbitrary
other
object
on
arbitrary
other
interface.
The
compiler
will
first
check.
Is
there
any
interface
hierarchy
where
this
can
be
true?
So,
for
example,
if
bar
is
sealed
and
you
cast
to
another
type
that
doesn't
derive
from
bar,
the
compiler
will
really
say
we'll
give
you
actually
narrow
and
say
that
cast
will
never
succeed.
D
I
D
D
Yeah,
since
all
the
comm
stuff
is
in
system
runtime
interrupt
services
like
I,
don't
know
that
the
compiler
would
ever
really
be
able
to
make
use
of
this,
because
it
would
essentially
need
to
evaluate
the
the
get
runtime
type
handle
to
figure
out
what
it
would
have
done.
So
I
don't
see
that
ever
having
language
support,
so
it
seems
good
I
would.
L
M
I
will
say:
I'm
thinking
about
one
of
the
scenarios.
Where
would
where
this
would
be
used.
So
one
of
the
scenarios
is
WinRT
and
with
one
RT,
a
lot
of
the
types
are
sealed
and
we
would
want
to
have
the
I
cast
the
eye
dynamic
interface,
castable
implementation
on
each
of
the
on
some
of
those
sealed
types.
So
we
can
do
the
casts
so
that
error
might
come
into
play
because
some
of
those
objects
are
just
straight
activatable.
They
can
just
do
new,
whatever
right.
D
D
A
D
A
I
mean
you
can
try
a
bit.
We
should
least
bring
it
up
for
them
because,
usually,
if
you
want
to
have
behavior
change
by
the
presence
of
some
interface
or
some
type,
you
want
to
usually
do
them
in
conjunction
a
better
I
mean
yeah
I.
Think
that's
reasonable,
I
think.
If
what
you
said
Jeremy
is
true
of
intervener
T.
It
would
be
probably
helpful
to
have
an
example
with
the
compiler
team
and
say:
here's
here's,
the
static
type
declaration,
here's
the
behavior
that
we
want
and
they
would
be
motivating
I,
guess,
yeah.
D
So
I
guess
it's
try,
try
writing
it,
where
you
have
a
sealed
type
in
the
same
assembly
and
and
you
write
the
new
and
then
and
immediately
cast
it
where
it
will
go
through
this
thing.
If
the
compiler
produces
a
warning
or
an
error
for
that
telling
you
that
it
knows
that
it's
not
possible,
then
now
you
can
raise
an
issue
with
the
compiler
team
of
hey.
This
new
interface
means
the
runtime
will
do
different
things
with
casting
remove
this
means
no
longer
or
you
can't
produce
the
warnings
anymore
and
they'll
probably
be
like
sure.
D
K
L
L
G
A
L
Okay,
I
guess
my
only
my
only
concern
there
would
be.
This
has
nothing
to
do
with
the
dynamic
keyword
and
I
would
I
would
be
very
I.
Don't
want
people
to
think
that
it
like
if
you
slap
dynamic
on
there,
this
will
participate.
This
has
anything
to
do
with
it.
They
mimic
keyword,
there's
no
implementation
overlap.
There,
you're
not
gonna,
get
into
some
performance
with
dynamic.
As
a
matter
of
fact,
if
you
use
this
and
dynamic
you're
gonna
get
some
weird
stuff
going
on.
A
A
I
mean
this
would
be
more
I
think
for
me,
a
constraint
if
it
would
move
it
to
compiler
services
again
because
in
the
interweb
services
it
really
is
a
runtime
concept
right
and
the
interval.
The
compiler
service
is
more
like
a
language,
compiler
kind
of
concept
and
yeah
in
the
language
world
dynamic
has
a
more
specific
meaning
that
in
the
runtime
world,
I
guess
but
I
mean
if
somebody
can
think
of
a
different
prefixes
dynamic,
then
maybe,
but.
A
Cool
that
was
easy,
so
let
me
just
throw
up
the
thing
that
I
have
right
now:
I
think
you
on
YouTube
so
probably
take
ten
seconds
for
you
to
see.
G
L
L
H
L
C
A
D
A
D
D
C
D
A
A
D
A
I
A
D
Yeah,
so
we
did
mention
that
there's
definitely
some
room
for
some
analyzers
here.
Do
we
feel
that
that
is
part
of
this
feature
or
just
a
nice
to
have
I
think.