►
From YouTube: .NET Design Reviews: GitHub Quick Reviews
Description
No description was provided for this meeting.
If this is YOUR meeting, an easy way to fix this is to add a description to your video, wherever mtngs.io found it (probably YouTube).
B
C
All
right
with
that
awesome,
let's
get
started
actually
before
before
we
start
it
looks
like
Carlos.
You
had
one
in
particular
that
you
wanted
to
go
over.
D
C
D
But
I
realized
that
I'm
also
going
to
need
to
make
another
constructor
public
if
I
want
to
implement,
create
from
file,
because
this
constructor
receives
a
handle,
a
file
stream
and
a
boolean
saying
if
we
need
to
leave
it
open
and
since
we
want
to
keep
the
same
behavior
well
I'm
going
to
need
to
make
this
constructor
public
too.
So,
oh,
and
also
on
my
previous
request,
I
talked
about
making
some
object,
security
classes,
adding
them,
but
I
realized.
They
are
not
necessary.
So
yeah
we
can
ignore.
Does.
E
C
D
E
D
Yeah
well,
if
we
want
to
keep
the
same
behavior
as
in
framework
for
create
from
file,
we
actually
need
to
pass
a
three
argument:
we're
creating
the
the
memory
maps
file
from
scratch
in
that
method,
because,
in
the
other,
two
methods
creating
you
and
Creator
open
we're.
Assuming
that
we
we
only
need
to
pass
a
handle.
D
D
E
The
point
is
like
wow:
that's
currently
the
constructor
that
was
convenient
for
the
person
who
wrote
the
functionality,
it
wasn't
public,
and
so
it's
making
it
public
there
become
all
sorts
of
questions.
Does
the
file
stream
have
to
be
positioned,
appropriately,
etc
versus?
If
the?
If
the
caller's,
which
I'm
looking
at
one
right
now,
which
is
create
from
file,
it
doesn't
take
a
file
stream?
So
maybe
we
want
to
constructor
that
takes
similar
arguments
and
we
move
the
file
stream
creation
into
that.
Constructor
like
this,
isn't
just
because
it
was
being
called.
E
F
F
A
G
E
E
A
C
Generally
speaking,
when
you
have
a
constructor
like
this,
that
takes
multiple
different
types
of
handles.
In
this
case
a
memory
map
file
handle
and
a
regular
file
handle.
Generally
speaking,
that's
an
internal
implementation.
Detail
of
the
type
that's
being
constructed,
for
instance,
does
memory
map
file
like
does?
Does
the
memory
map
final
class
have
a
property
that
exposes
the
underlying
file
stream?
C
E
C
E
C
C
E
E
E
D
E
Now
it's:
how
do
we
make
this
method
work
in
core,
where
we
have
a
layering
separation
from
the
apples
and
the
and
the
platform-independent?
And
so
I
guess
really
it's
hard,
because
we
can't
like
we
need
the
Apple
created
in
one
place
in
the
stream
creating
the
other.
So
maybe
the
answer
is
we
can't
make
this
one
work
on
core.
E
A
E
A
Ask
this
neat
handle
for
the
mapping
and
not
the
file
stream.
That's
what
I'm
asking
the
purpose
of
the
file
stream
is,
so
you
can
create
the
mapped
handle
on
top
of
it,
I
assume
unless
we're
using
it
for
some
other
reason.
You
only
think
the
only
reason
we
store
the
file
stream
is
to
clean
it
up.
Yeah.
H
C
C
E
C
A
E
H
C
D
F
D
F
C
B
C
A
D
G
D
G
E
Yeah,
if
anybody
is
already
looking
at
a
time
span
and
they're
asking,
is
it
less
than
zero
and
throw
like
this
value
is
already
useless
for
them
and
you
can't
just
easily
say:
wait
forever.
You
have
to
look
at
it
and
compare
it
to
see
if
it's
the
same
I
I
agree
with
Steve.
It
doesn't
make
sense
to
be
a
number
other
than
negative
one
and
then
I
agree
that
it
doesn't
make
any
sense
to
be
negative
one.
So
yeah.
C
It
looks
like
there
was
a
suggestion
earlier
in
the
thread,
I
think
from
Steve,
just
to
call
it
out
clearly
in
the
documentation.
But
there
is
this
other
Sentinel
value
on
the
timeout
class
itself
and
that,
honestly,
that
documentation
should
probably
be
referenced
by
each
individual
API.
That
you're,
calling
rather
than
by
the
timespan
class
itself,
I
mean.
E
A
C
G
A
C
C
C
G
And
so
the
proposal
is
essentially,
we
just
expose
another
property
alongside
zero
called
all
bit
set,
as
opposed
to
one
which
is
1
right,
because
one
would
be
confusing,
as
you
don't
know,
if
it's
like
1.0
F
for
float
and
the
literal
integer
1
verb
into
cuyps
or
something
else.
So
all
bits
was
the
name
we
came
up
with.
That
was
determined
to
be
unambiguous.
C
Wasn't
there
a
wasn't
there
an
equivalent
API
on
vector
of
T
unless
I'm
misremembering,
no.
C
E
C
G
So
so
that
one's
a
bit
iffy
I
would
say
yes,
but
the
the
reason
we
might
not
want
to
is
vector
of
T
doesn't
expose
the
same
set
of
blending
and
other
instructions
that
operate
on
masks
that
the
intrinsic
do,
and
so
it
might
be
a
we
want.
We
will
expose
it
eventually,
but
only
after
we
expose
more
api's
on
vector
of
T.
That
actually
would
take
a
mask.
G
H
D
C
C
C
C
Are
you
still
on
the
cost
to
you
yeah
here?
Okay,
did
you
did
you
have
any
additional
thoughts
on
whether
you
were
still
hesitant
about
code
being
copied
into
another
method?
I
wasn't.
H
H
C
H
Unless
I'm
missing
something
no
no
I
I,
don't
think
it
was
actually
there.
So
he
started
with
this
and
then,
if
you
scroll
down
a
little
bit,
David
said
he
was
also
interested
in
one
that
takes
a
funk
and
I
was
saying:
oh
that's,
where
the
discussion
sort
of
diverged
to
talk
about
that
I'm
saying
I,
don't
want
to
add
that
you
can
do
that
on
top
of
the
other
one
sure.
C
H
C
C
E
Okay
object,
ampersand
and
your
object
and
semicolon
T
state
ampersand
are
completely
unmatchable
types,
so
the
roughness
is
a
totally
complete,
unique
slot,
except
for
the
magic
word
in
which
makes
it
look
like
it's
not
there,
but
the
ampersand
is
still
there.
Yes,
I
did
a
lot
of
playing
recently
with
what
happens
if
you
add
or
remove
retinas,
and
how
bad
does
the
runtime
handle.
It
sure.
C
Does
as
far
as
null
ability
goes
does
the
t-state
parameter
here
is
I
have
highlighted,
need
a
question
mark
on
T
State
I'm,
not
quite
sure
how
that
works
with
ruff
know.
H
H
We
should
get
the
only
questions,
some
of
the
there's
something
consistency
in
naming
which
should
be
like.
Why
is
one
called
context
and
one's
called
execution
context,
but
sure
yeah
we
should
just
match
whatever
weeks
we
currently
have
I
believe
it's
certainly
called
execution
context.
So
that's
what.
C
C
Often
this
is
for
parsing,
comma
separated
values
where
you
could
have
a
comma
B
or
a
comma
space.
The
would
I
had
proposed,
and
you
know
there
are
references
to
a
bunch
of
different
places
in
dotnet,
where
we
do
this.
What
I
had
proposed
was
adding
another
string,
split
options
which
automatically
trimmed
all
of
the
strings
coming
back.
C
So
if
you
were
to
call
if
you
were
to
call
string,
got
split
on
Doh,
comma
space
John,
for
instance,
you
would
get
Doh
and
John
as
opposed
to
Doh
space
John,
and
this
would
also
this
would
be
a
flags
arguments
along
with
remove
empty
entries.
So
in
this
particular
example,
there's
nothing
between
the
1
and
the
2,
so
you
don't
get
like
one
empty
string,
2
3!
As
your
return
values,
you
just
get
one
two
and
three.
This.
B
C
C
As
far
as
I'm
aware
we're
the
only
entity,
that's
ever
supposed
to
be
interpreting
this
enum.
So
in
theory
adding
values
should
be
okay.
But
if
you
have
a
third
party
library,
that's
taking
a
string,
splitted
options
and
then
someone
passes
in
an
unrecognized
enum
value
that
library
could
throw
an
exception
or
have
otherwise
undefined
behavior.
We.
G
H
E
C
G
H
H
G
C
C
E
C
E
C
To
be
honest,
I
don't
see
a
big
scenario
for
it.
Just
given
how
people
historically
have
used
these
api's
I
could
imagine
that
in
really
really
high
performance
use
cases,
you
might
only
care
about
one
direction
or
another,
but
in
that
case
we
should
really
just
be
directing
you
to
the
span
api's
fair
enough,
but
now
one
of
the
questions
would
become
like.
Would
something
like
this
make
sense
in
the
span
based
api's
or
would
people
just
slice
themselves,
because
it's
cheap
to
do
that?
Yeah.
C
E
B
E
C
C
And
maybe
maybe
a
better
name
for
this
would
be
trim
white
space
because
we're
not
olette
we're
not
giving
you
the
option
of
trimming
arbitrary
characters
from
it.
G
Yeah
I
would
think
the
common
case
is,
you
would
use
trim
start
for
things
like
you
read
a
line
and
you
want
to
ignore
leading
white
space,
but
you
care
about,
for
example,
trailing
new
lines
and
on
the
other
end,
is
you
use
trim
and
specifically
because
you
just
want
to
remove
new
lines
from
the
end
of
it,
for
example,
but
other
than
that
I
think
trims,
the
common
one
yeah.
But
then
you
were
probably
just
splitting
on
new
line
already
pretend.
C
B
G
E
Trim
white
space
is
ambiguous.
Are
you
trimming
the
string
before
splitting?
Are
you
trimming
each
individual
entry
like
I
like
the
fact
that
increases
in
there,
because
it's
indicating
that
you're
doing
it
on
a
per
entry
basis?
If
you
want
to
work
white
space
into
that,
while
keeping
entry,
that's
fine
but
I,
think
then
you're
gonna
get
a
very
long
name.
That's
not
gonna
be
much
more
descriptive
and
you.
E
C
E
E
G
Think,
due
to
the
overload
that
takes
no
parameters
only
being
added
neck
or
someone
would
have
to
go
and
look
at
how
many
use
cases
are
calling
trim
start
and
passing
are
calling
the
one
that
takes
a
care
array
and
just
having
it
be.
The
no
because
that's
used
in
trim,
trim
and
is
used
in
40%
and
trim
starts
used
in
almost
50.
You
know
in
the
in
phases
and
if
they're
you
that
much
then
there's
likely
a
scenario
where
we
should
support
it
here
as
well.
C
Sure
I
can
I
can
take
this
I
can
take
this
offline.
Do
some
investigation
for
start
and
end
and
then
bring
it
back
to
review,
sounds.
E
C
F
C
C
C
Okay,
that
was
four
one.
Four
eight
seven,
okay
I
have
my
OneNote
on
another
machine
that
I'm
typing
all
this
into
four
one:
seven,
eight
three:
this
was:
we
had
a.
We
had
a
scenario
where
we
actually
wanted
to
generate
null
refs
in
c-sharp,
but
the
c-sharp
language
doesn't
allow
you
to
have
a
ref
to
a
null
value.
It's
perfectly
valid
IL
and
it's
also
perfectly
typesafe.
E
C
E
I've
I've
had
to
overload
that
to
take
byte
array.
Just
so
I
could
pass
the
null
through,
but
so
I
can
definitely
see
this
being
good
for
P
and
VOC.
I
do
like
the
get
me
the
null
ref
being
on
unsafe,
because
it's
really
hard
like
in
c-sharp.
You
can't
really
deal
with
it
other
than
that
is
no
ref
question
here.
You
just
you,
try
using
it.
Then
you
die
yeah.
E
C
E
A
E
C
C
G
C
G
C
G
That
also
not,
strictly
speaking,
a
bug,
it's
just
a
case
where
it
will
always
return
false
where
it.
So
it's
basically
a
question
of
do
we
want
some
cases
where
the
user
might
get
false
because
they
passed
in
a
temporary,
which
should
only
happen
for
for
RHS
assignments,
or
do
we
want
to
force
users
who
are
working
with
read-only
rafts
to
require
an
additional
call
too
unsafe,
as
wrath
passing
in
the
end
and
getting
a
ref
back
out
so.
G
G
G
I,
as
someone
who
uses
roughen
in
fairly
frequently
for
Interop
code
in
other
cases,
would
much
rather
take
in
and
have
an
analyzer
warned
me
of
the
case
that
you
know
you
forgot
to
use
in
here.
So
you're.
Patching
passing
in
an
r-value
then
have
to
add
additional
API
calls
to
coerce
the
wrong
way.
So.
G
G
G
Volatile
Reed
takes
a
Rath,
even
though
it
never
mutates
the
underlying
reference,
and
that's
a
that's
a
the
reason
it
does.
That
is
because
we
didn't
have
in
way
back
in
the
day,
but
because
it
does
that
if
you
actually
have
a
read-only
ref
and
you
want
to
do
a
volatile
read
from
it,
you
are
put
in
the
position
of
you
have
to
add
unsafe
calls
to
to
make
it
happen,
which
not
only
makes
the
code
less
readable,
but
it
makes
it
less.
Maintainable
adds
some
level
of
confusion,
etc,
etc.
G
C
G
C
You
have
some
time
Tanner,
just
like
maybe
find
a
short
list
type
it
up
of
api's
that
you
think
might
benefit
from
going
from
ref
in
you
had
mentioned
volatile
and
is.
G
G
C
C
G
Well,
maybe
if
we
come
up
with
enough
scenarios,
they
would
allow
it,
but
the
concern
raised
here
of
you
can
pass
in
our
value
in
to
medicine
yeah.
E
Yeah
I
mean
if
this
was
gonna,
be
a
super
common
thing.
Then
I
would
have
more
hesitation,
but
I
think
that
this
is
gonna,
be
nice
enough
that
the
analyzer
could
catch
it
and
but
I
think
having
an
analyzer,
for
it
is
sensible.
It's
the
same
thing
as
when
the
compiler
tried
adding
the
hey
you're,
comparing
a
value
type
to
null,
so
we
box
it
or
we
turned
it
to
null
above
and
then
returned
false
for
you.
E
C
C
G
H
G
But
it's
a
question
of:
do
you
want
most
code
to
just
work,
or
do
you
want
users
who
have
a
read-only
ref
to
have
to
go
an
additional
step
to
call
this
API
and
the
only
downside
to
taking
in
think
that
you
can
pass
an
r-value
in
without
using
the
in
keyword?
In
which
case
this
method
will
return
false
and.
H
G
C
E
So,
like
my
on
the
one
level
my
feeling
is,
it
should
be
in
and
we
can
write
an
analyzer
for
it
and
not
the
like
forty
people
who
are
ever
gonna
use.
It
are
gonna,
get
it
right
most
of
the
time
the
and
they
should
be
testing
and
cover
when
they
didn't
get
it
right.
The
but
I
could
also
see
a
thing
of
if
we
believe
that
the
c-sharp
language
is
never
going
to
fix
the
the
you
can't
change
a
ref
to
an
end
without
breaking
every
one.
E
C
H
Does
it
live
so
our
plan?
Our
tentative
plan
right
now
is
to
add
a
set
of
analyzers
that
basically
ship
as
part
of
the
SDK,
but
they
would
be
like
anything
that
ships
there
and
is
on
by
default
would
have
to
have
as
close
to
zero
false
positives,
and
you
know
basically
no
noise.
It
annoys
to
signal
ratio,
as
you
could
possibly
imagine
because
of
beyond
for
everyone
all
the
time,
so
basically
zero,
false
positives,
yeah
that
make
sense,
but.
E
C
C
Okay,
so
how
about
this
I
will
I
will
punt
this
back
to
myself
and
I
will
I'll,
you
know,
have
a
sit-down
with
you
tenor
and
some
other
folks
from
the
language
team
and
just
hash
out
what
the
potential
problems
might
be
and
how
we
might
be
able
to
address
those
problems
either
in
an
analyzer
or
with
language.
Syntax
changes.
Does
that
seem
reasonable.
That
seems.
B
A
H
Just
we
we
have
a
an
issue
of
all
the
analyzers
that
we
have
talked
about
are
all
the
analyzers
that
are
sort
of
known
to
be
on
the
list
to
be
considered
for
dotnet
v.
I
do
not
know
if
that
is
complete
with
every
analyzer
that
people
have
talked
about
here.
I
would
suggest,
go
and
look
at
the
list
and
see
if
anything's,
missing,
I
believe.
G
C
E
So
right
now
I
guess
there
are
two
problems.
One
is
because
symmetric
cryptography
was
written
using
an
interface.
We
have
no
way
to
span
a
Phi
it
or
at
least
no
good
way
to
span
a
Phi
it
and
another.
Is
everybody
like
it
takes
a
lot
of
code
to
kind
of
do
it
right
and
everybody
kind
of
gets
it
wrong
on
their
first
six
attempts,
and
so
what
most
people
want
to
do
is
I.
E
Have
some
data
I
want
to
encrypt
it,
and
so
we're
saying
how
about
on
like
on
symmetric
algorithm,
so
on
AES
and
Triple,
DES,
etc,
that
you
just
get
an
instance
method
of
like
let's
go
and
crypt
some
data,
and
then
this
also
sort
of
gets
rid
of
the
the
fact
that
a
property
controls
a
mode
that
most
people
don't
understand
and
then,
when
they
set
the
mode
they
don't
understand
what
properties
are
relevant.
So
this
this
is
kind
of
do
cryptography.
The
way
it
should
have
been
done
in
the
first
place
as
a.
E
So
the
basic
this
is
essentially
just
going
off
of
buffers
guidance.
The
the
basic
thing
is,
we
have
try
encrypt
em
in
a
mode
and
then
the
arguments
that
it
takes:
try
decrypt
in
a
mode
and
the
arguments
it
takes
and
then
and
then
me
like
we'll
just
do
it
for
you
and
then
that
will
return
an
answer
for
you,
and
so
it's
each
one
is
just
a
like
all.
His
groupings
here
are
just
flavors
of
the
same
thing.
C
E
E
E
C
C
C
E
E
The
key
property
if
the
padding
modes
are
default
because
the
padding
mode
default
is
actually
an
invalid
value.
If
the
padding
mode
is
default,
then
it
will
use
the
property,
otherwise
that
we
use
the
Brandtner
sorry
to
say
say
that
again,
sorry,
if
the
so
the
patting
mode
for
CBC
or
I,
guess
the
patting
mode
for
every
for
all
the
non
stream
modes
is
a
default
parameter.
The
default
value
is
in
is
itself
an
illegal
value.
Therefore,
we
can
detect
the
default
value
and
then
say
we
will
defer
to
the
property.
Do.
C
C
C
E
E
C
C
E
C
Does
this
work
if
you
have
multiple
threads,
calling
this
simultaneously,
because
right
now
on
the
symmetric?
Well
right
now
on
the
symmetric
algorithm
class,
you
can
call
create
encrypter
or
create
decrypter
from
multiple
threads
simultaneously,
and
we
make
kind
of
pseudo
type
safety
guarantees
yeah.
E
C
E
C
E
A
E
E
C
E
H
F
E
C
Up
so
I
can
I
can
be
convinced
that
thread
safety
actually
isn't
a
huge
issue
here,
because
I
can't
imagine
a
scenario
where
somebody
would
create
a
symmetric
algorithm
and
then
using
the
exact
same
key
and
then
call
multiple
different
encrypt
or
decrypt
methods,
saying
sometimes
I
want
CBC,
sometimes
I
want
ECB
and
so
on,
like
that's
just
setting
yourself
up
for
disaster
at
that
point,
so,
okay,
so
I'll
rescind
my
I'll
rescind
my
my
protests
there,
but
you
were.
You
were
suggesting
that
the
default
implementation,
then
would
just
be
set.
E
E
C
C
E
C
C
E
C
A
C
Coromant
we're
a
given,
given
that
we
explicitly
force
you
to
pass
the
IV
and
we
don't
use
the
IV
from
the
actual
symmetric
algorithm
itself.
I
would
almost
be
tempted
to
say
like
force
them
to
set
the
padding
mode
as
well
or
default.
It
I
mean
if,
if
it's
CBC
defaulted
to
pkcs7,
just
because
yes
so.
C
Possibly
because
I
don't
know
what
a
default
would
be
for
ECB
honestly.
C
E
E
F
C
It
the
default
could
probably
just
call
the
implementation,
I
I
think
my
I
think
my
problem
with
with
read
safety
was
probably
a
bit
too
strict
and
I.
Don't
really
see.
I,
don't
really
see
a
problem
in
hindsight,
just
because
I
don't
see
anybody
using
different
modes
of
operation
using
the
same
key
on
the
same
symmetric
algorithm
instance.
The
third.
E
Suggestion
or
third
potential
thing
is
ignoring
the
possibility
of
race
condition
because
it's
not
a
thread
safe
type.
We
we
say
that
the
default
implementation
will
throw.
If
you
call
a
mode,
that's
not
the
one
that's
set
in
the
property,
it
refuses
to
change
the
value,
but
if
it's
right
it
will
use
it.
C
C
E
A
A
C
Property
there
is
to
your
to
your
question:
Corinne.
There
is
a
create
encrypter
method
that
all
symmetric,
algorithm
classes
have.
In
fact,
it's
abstract.
You
have
to
override
it.
The
key
and
ID
are
passed
in
there
explicitly,
so
you
can
do
that
without
needing
to
set
the
key
or
IV
properties.
Okay,
so
that's
what
we
would
call
in
here
covers
yeah.
E
E
C
G
E
C
E
C
C
C
E
C
C
E
E
E
C
E
E
E
C
C
One
one
other
thing
is:
make
a
constructor
that
takes
I
read-only
dictionary
that
has
a
different
arity
than
the
other
constructors.
That
way
it
can
never
conflict
but
I,
don't
we
would
literally
be
introducing
an
unused
parameter
for
the
sake
of
introducing
an
unused
parameter,
which
is
a
bit
weird.
F
E
C
E
E
C
E
Could
be
an
ad
range?
It
takes
the
innumerable
on
all
the
other
things
which
are
which
don't
have
like
a
in
level
of
interface
problem.
Theoretically,
that's
just
the
ienumerable
and,
and
so
all
of
those
seem
like
things
that
are
reasonable
ad
range.
We
just
can't
solve
it
with
a
constructor
avoid
because
of
ambiguity
right.
D
E
D
E
C
So,
let's
see
here,
I
read
only
dictionary
to
key
T
value.
My
dick
T
equals
get
dictionary
sorted
dictionary
news.
E
C
C
C
Would-
and
we
can,
we
can
do
the
same
thing.
That
link
does
we
can
we
can
special
case
individual
types
in
there
if
we
have
to
in
order
to
get
performance
back,
and
we
can
we
can
as
it
out
if
we
think
that
there's
a
small
implementation,
so
the
constructor,
instead
of
being
a
one-line
constructor,
the
Constructors,
really
two
lines
creating
a
thing
and
then
populated,
oh
and.
C
C
C
So
it
looks
like
object.
Disposed
exception
does
not
have
from
this
description,
all
of
the
different
constructors
that
we
would
expect
from
an
exception,
type
object.
Name
message
enter
exception:
oh
yeah,
the
longest
constructor,
which
would
the
object
name
and
message
is
missing
the
inter
exception.
Okay,
sure,
let's.
A
E
C
A
C
C
C
H
H
C
G
A
E
Mean
it's
technically
fine
and
I
guess
if
we
already
have
the
other
ones,
then
it's
it's
good,
hey
I,
don't
know
what
state
you're
in
when
you
need
it,
but
the
problem
is
gonna,
be
like
with
argument
exception,
like
the
real
base
class
argument.
Action
of
the
strings.
Comma
exception
is
not
the
one
you
want.
It's.
C
C
Argument,
the
one
with
brand
name
is
no
later
parameter.
So,
let's,
let's
put
this
back
then
with
a
message
asking
like
do
you
actually
need
this
because
in
in
their
case,
they're
just
sub
classing
that
presumably
for
their
own
purposes,
but
they
could
introduce
the
missing
parameter
at
their
level
and
then
just
fill
in
the
dots
as
needed.
F
C
D
E
Mean,
like
the
real
question,
is:
if
he's,
if
he's
sub
classing
it-
and
this
is
just
the
hey
while
sub
classing
it
I
realized
something
weird
like
this
feels
like
a
wart.
Really,
the
question
is:
what's
the
scenario
yes
because,
because
you
shouldn't
find
out,
via
some
other
exception,
that
you're
in
a
disposed
State
generally
like
I,
can't
think
of
when
that
would
be
something
we
would
call
correct.
Behavior
I.
G
A
E
H
A
E
C
E
C
E
E
Let's
see
here.
The
only
thing
I
can
think
of
that.
Maybe
you
would
do
it
is
if
you
have
a
if
you're,
throwing
one
if
you're
wrapping
an
object,
exposing
exception
with
a
higher
level
object
expose
exception,
but
that
just
means
you
missed
the
boolean
like
you
should
have
had
the
boolean.
You
should.
C
G
G
G
A
A
G
Basically,
if
you
have
a
read-only
nullable,
so
like
public
private
static,
read-only
int
question
mark
equals
five,
and
you
call
has
value
on
that
read-only
field.
It
will
create
a
private
hidden
copy
today,
because
the
compiler
can't
know
that
has
value
doesn't
mutate
marking
it
is
read-only
tells
the
compiler.
This
doesn't
mutate,
which
allows
you
to
avoid
the
copy
and.
B
C
Yes,
this
makes
sense,
because
one
of
the
other
things
that
I
had
brought
up
in
a
separate
issue
was:
does
it
ever
make
sense
to
have
a
to
have
a
getter
that
returns
ref
we'd
only
of
the
value
itself,
because
I
know
like
Jeremy,
that
would
have
made
some
of
the
stuff
that
you
were
working
on
a
little
bit
easier?
Probably
but
whatever,
because
this
is
still
going
to
return
a
copy
of
the
value.
It's
just
not
going
to
make
a
copy
of
the
nullable
of
T
before
it.